- Wissenschaft, die sich mit der Darstellung, Speicherung, Übertragung und Verarbeitung von Daten befasst
- untersucht folgende Aspekte:
- Elementare Strukturen und Prozesse
- Prinzipien und Architekturen von Systemen,
- Interaktion in kleinen, mittleren und weltumspannenden Netzen,
- Konzeption, Entwicklung und Implementierung von Hardware und Software sowie Reflexion dieser
Was ist ein Algorithmus?
- präzise. endliche Vorschrift zur Ermittlung der Lösung einer allgemeinen Aufgabenstellung durch elementare Lösungsschritte
- Eine konkrete Aufgabe wird dabei durch vorgegebene Ausgangsdaten beschrieben für die Lösungsdaten berechnet werden.
- Bei den elementaren Lösungsschritten handelt es sich um Operationen, die ein Prozessor formal und effektiv ausführen kann
- Die Durchführung des Lösungsverfahrens endet stets nach endlichen Schritten.
Java Entwicklung
Java ist:
… eine Programmiersprache.
… eine Laufzeitumgebung.
Einsatzmöglichkeiten:
- Mobile Endgeräte
- PCs
- TV-Geräte
Versionen
JDK -> Java Development Kit
JRE -> Java Runtime Enviroment (ab Version 11
über JDK)
Konzept einer virtuellen Maschine
- Java-Compiler übersetzt Java-Programmiertext in “Byte-Code” (Befehle für die Java Virtual Machine (JVM))
- Java-Interpreter führt den “Byte-Code” aus und simuliert einen “virtuellen Prozessor” Java-Quellcode -> Java-Compiler -> ByteCode CLASS-Datei
Wichtige Kommandos
- Programmübersetzung (Compile)
Javac Hello.Java-> Hello.class - Programmausführung (Run)
Java Hello-> Programmausführung - Quellcode-Analyse (Disassemble)
Javap -c Hello-> Byte-Code anzeigen - java java_befehle
Arten von Java-Programmen
Stand-Alone-Anwendungen
- eigenständige Anwendungen (mit oder ohne grafische Oberfläche)
Applets
- Anwendungen mit grafischer Oberfläche als Bestandteil eines HTML-Dokuments
Servlets
- Java-Klasse, welche auf einem speziellen Java-fähigen Server ausgeführt werden. Server: u.a. Tomcat, Websphere, JBoss
Java Syntaxhinweise
- fast jede Anweisung muss mit einem Semikolon (;) abgeschlossen werden
- Java unterscheidet zwischen Gross-/Kleinschreibung
-> “wert” ist nicht gleich “Wert”
- Beliebiges Einfügen von Leerzeichen/Leerzeilen zwischen Anweisungen ist zulässig
Was ist eine Klasse?
Eine Klasse ist eine Sammlung von Daten (Attributen) sowie von
Methoden (Operationen), die mit diesen Daten arbeiten.
Eine Klasse umfasst im wesentlichen zwei Dinge:
-> Attribute (was das Objekt hat)
-> Operationen (was das Objekt kann)
Aufbau von Java-Klassen
- Klassen sind die zentralen Elemente der objektorientierten Programmierung
- jedes Java-Programm besteht aus mindestens einer Klasse
Schlüsselwort
class
Bezeichnung/Name der Klasse
Zusatz:Klassenrumpf -> in “{}” (geschweifte Klammern)
vor dem Schlüsselwort
class können Modifikatoren stehen
-> legen Eigenschaften der Klasse fest, z.B. public oder
private
Klassenname und Dateiname (*.java) müssen immer gleich sein!
- Modifikator
public - Schlüsselwort
class - Bezeichner/Name der Klasse
Hallo Asterix
public class Hallo Asterix {
}+
Klassenrumpf (zwischen den geschweiften Klammern)
Aufbau von Java-Klassen - Klassenrumpfinhalt
Inhalt:
- Methoden
- Variablen
public static void main(String[] args) {
String ichBinEineVariable = “Hallo, Asterix!”;
System.out.println(ichBinEineVariable);
}
Erklärung:- Jeder darf mich sehen
-> Sichtbarkeit (
public) - Ich bin eine Klassenmethode
->
static - Ich gebe nichts zurück
->
void - Ich heiße
main - Du kannst mir etwas mitgeben
-> Parameter (
args) als
ZeichenkettenarrayString[]) main(String[] args)->mainals Startmethode einer Java-AnwendungichBinEineVariable-> Variable mit einer ZeichenketteSystem.out.println(ichBinEineVariable)-> Vordefinierte Methode zum Ausgeben von Text auf der Konsole
Variablen
- Variablen sind Platzhalter, die mit einem Wert belegt werden
- Technische Sicht: Verweis auf Speicherbereich im Hauptspeicher
- Inhalt der Variablen kann i.d.R geändert werden
- Platz im RAM wird durch die Deklaration (Anmeldung) reserviert
- Variablen wird meist ein Datentyp zugewiesen
= Zur Dokumentation von Quellcode
Unterteilung:
- Zeilenkommentar -> beginnt mit
// - Mehrzeilenkommentar -> beginnt mit
/*und endet mit*/ - Dokumentationskommentar -> beginnt mit
/**und endet mit ``*/”
Kontrollstrukturen
Reihenfolge/Sequenz
- Funktionsweise: Die Anweisungen in einer Sequenz werden hintereinander ausgeführt.
- Beispiel (Java):
System.out.println("byte:");
System.out.println("\t minimaler Wert: "+ Byte.MIN_VALUE);
System.out.println("\t maximaler Wert: "+ Byte.MAX_VALUE);
System.out.println("\t bit-Anzahl: "+ Byte.Byte.Size);)
- if-else-Anweisung
- switch-Anweisung
- Bedingungsoperator
- ↳ benötigen logische Beziehungen
- Aussagen: Aussagen sind sprachliche Gebilde, die entweder den Zustand wahr oder falsch haben. Aussagen können logisch verbunden (Junktoren) sein.
| Aussage | Junktor |
|---|---|
| Nicht A | ¬A |
| A und B | A ∧ B |
| A oder B | A ∨ B |
| Wenn A dann B | A → B |
| A genau dann, wenn B | A ↔ B |
Beispiel: Hans möchte, dass möglichst viele seiner Freunde Anne, Bernd, Christine, Dirk und Eva zu seiner Bachelorverteidigung kommen. Er weiß Folgendes: Wenn und Anne beide kommen, dann wird Eva auf keine Fall kommen. Und Dirk wird auf keinen Fall kommen, wenn Bernd und Eva beide kommen. Aber Eva kommt allenfalls dann, wenn Christine und Dirk kommen. Andererseits kommt Christine nur dann, wenn auch Anne kommt. Anne wiederum wird nur dann kommen, wenn auch Bernd oder Christine kommen.
- 1. Schritt: Anne -> A, Bernd -> B, Christine -> C, Dirk -> D, Eva -> E
- 2. Schritt:
- B ∧ A -> ¬E
- B ∧ E -> ¬E
- E -> C ∧ D
- A -> C
- B ∨ C -> A
Logische Beziehungen
AND:
| A | B | Ergebnis |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 0 |
| 1 | 0 | 0 |
| 1 | 1 | 1 |
NOT:
| A | Ergebnis |
|---|---|
| 0 | 1 |
| 1 | 0 |
OR:
| A | B | Ergebnis |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 1 |
XOR:
| A | B | Ergebnis |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Darstellung von logischen Beziehungen
| Operator | Ausdruck | Beschreibung | ||||
|---|---|---|---|---|---|---|
| ! | !a | NOT | ||||
| && | a && a | AND | ||||
| a { | } b | OR |
Unterschied zwischen && / || und & / |:
- Bei logischen Ausdrücken mit & und | werden beide Ausdrücke bitweise bewertet.
- Bei logischen Ausdrücken mit && / || wird gegebenenfalls schon nach dem ersten Ausdruck eine Entscheidung getroffen.
Vergleichsoperatoren
| Operator | Ausdruck | Ausdruck liefert true, wenn |
|---|---|---|
| > | a > b | a größer als b ist |
| >= | a >= b | a größer oder gleich b ist |
| < | a < b | a kleiner als b ist |
| <= | a <= b | a kleiner oder gleich b ist |
| == | a == b | a gleich b ist -> nur für elementare Datentypen |
| != | a != b | a ungleich b ist |
Rechenoperationen
| Operator | Ausdruck | Erklärung |
|---|---|---|
| + | + | Addition (Plus) |
| - | - | Subtraktion (Minus) |
| * | * | Multiplikation (Mal) |
| / | / | Division (Teilen) |
| Modulo | % | Modulo (Restwertdivision) |
| Modulo (ohne %) | m-n*(m/n) |
if-else-Anweisungen
if-Anweisung:
if (bedingung) {
Anweisungen -> werden ausgeführt, wenn bedingung true liefert
}
if-else-Anweisung:
if (bedingung) {
Anweisungen -> werden ausgeführt, wenn bedingung true liefert
} else {
Anweisung -> werden ausgeführt, wenn bedingung false liefert
}
''if-Schleife":
if (bedingung) {
...
} else if (bedingung) {
...
}
-> ∞switch-Anweisung
- Die switch-Anwendung ist eine Mehrfachverzweigung, sie kann eine Folge von if-else-Anweisungen ersetzen.
switch (ausdruck) {
case wert1: Anweisungen ...
case wert2: Anweisungen ...
default: Anweisungen
} - default: Anweisung wird genommen, wenn kein
casegenommen werden kann.
- Konditionaloperator, ternärer bzw trinärer Operator
a ? b : c;- -> ist a
true, dann b - -> ist a
false, dann c
- -> ist a
- for
- Erweiterte for-Schleife
- Kopf-/Fuß-gesteuerte-while-Schleife
- Kopf-gesteuert
- kann durchlaufen werden, muss aber nicht
while (bedingung) {
Anweisungen
}
do-while-Schleife - Fuß-gesteuert
- wird mindestens 1x durchlaufen
do {
Anweisungen
} while (bedingung);
for-Schleife Aufbau:
for(init; bedingung, zählen){
Anweisungen
}
Erweiterte for-Schleife Aufbau:
for(Speichervariable: Datenstruktur){
Anweisungen
}
OOP - Objektorientiere Programmierung- Stand der Technik in der Programmierung
- Ersatz für ältere Programmiertechniken u.a. prozedurale Programmierung
- Ziel: "reale Welt" möglichst einfach abbilden
- Welt besteht aus Objekten
- Objekte sind klassifizierbar
- Definition: Objekte sind unter dem Gesichtspunkt der Syntax
Programmierelemente, die aus Klassen erzeugt werden. Ein Objekt ist ein
"Ding mit Eigenschaften und Methoden".
- Eigenschaften: beschreiben das Objekt und legen den Zustand des Objektes fest
- Methoden: sind aktive Vorgänge, welche auf das Objekt angewendet werden und den Zustand verändern
- Attribute von Objekten dürfen nur über Methoden Zugriff erfahren -> Geheimnisprinzip

Sichtbarkeit
- ermöglichen Zugriffskontrolle/Datenkapselung ("information
hiding"):
- Welche Methoden und Attribute sind fir andere Klassen sichtbar?
- Welche Methoden und Attribute können vom wem aufgerufen bzw. verändert werden?
- Modifikatoren:
public,protected,private, aber auch "default" (ohne Modifikator) - Modifikatoren sind optional (= "
default")
Sichtbarkeit für Methoden und Attribute
| Zu sehen von | public |
protected |
default |
private |
|---|---|---|---|---|
| innerhalb der selben Klasse | Ja | Ja | Ja | Ja |
Klassen im selben package |
Ja | Ja | Ja | Nein |
Klasse außerhalb des
package |
Ja | Nein | Nein | Nein |
Unterklassen im selben
package |
Ja | Ja | Ja | Nein |
Unterklasse außerhalb des
package |
Ja | Ja | Nein | Nein |
Java Package
Gruppierung von Klassen zu einem Bereich
Unterscheidung:
- Java-intern
- eigene Packages
import
java.util.Arraylist; //Import einer einzelnen Klasse
import java.nio.*; //Import eines gesamten Packages mit allen Klassen der
Ebene Konventionen:
- nur Kleinbuchstaben und Zahlen, Substantive
- für Internationalisierung: Domainnamen in umgekehrter Reihenfolge
package de.hsmw;
Der Konstruktor
- Definition: Methoden zum Erzeugen von Objekten einer Klasse werden als Konstruktoren der Klasse bezeichnet.
- In Java hat jede Klasse automatisch einen sogenannten
Standard-Konstruktor, welche aus dem Namen der Klasse und einem
Klammernpaar
()besteht. - Beispiel:
public class Punkt {
public Punkt (){
}
}
toString()- gibt die Klasse als Darstellung eines Strings zurück
- alle Klassen haben die
toString()-Methode:- entweder eigene Implementierung
- oder Implementierung vom Objekt (Klassenname@Hashcode)
- zum Vergleich zweier gleicher Objekte
- equals() vs. ==
- Vergleich von Objekten auf Gleicheheit erfolgt mittels der
Methode
equals - ein Vergleich mit
==bei Objekten führt nur zum Vergleich der Speicheradresse - nur elementare Datentypen werden mit
==verglichen
- Vergleich von Objekten auf Gleicheheit erfolgt mittels der
Methode

- unterstrichene Methode: Klassenmethode -> brauchen kein Objekt, um benutzt zu werden
- nicht unterstrichene Methode: Objektmethode -> brauchen ein Objekt, um benutzt zu werden
- Verbal
- Pseudocode
- Struktogramm
Struktogramm
↳auch: Nassi-Shneiderman Diagramm
- stellen Algorithmen in graphischer Form dar
- einzelne Lösungsschritte werden als „Anweisungen" durch Rechtecke dargestellt.
- jede Anweisung kann durch eigenes Struktogramm verfeinert werden (Rechteck mit Doppellinien).
- Was eine Anweisung ist, hängt von der Abstraktionsebene ab.
- Kontrollstrukturen haben charakteristische Sinnbilder.
- Ablauf des Algorithmus entspricht einem Durchlauf durch Struktogramm von oben nach unten.

Verbal
- Bestimmt den größten gemeinsamen Teiler für zwei positive ganze Zahlen A und B:
- Falls A < B ist, werden die Werte von A und B vertauscht.
- Anschließend dividiert man A durch B im Bereich der ganzen Zahlen und ermittelt den Rest R zwischen 0 und B - 1.
- Falls R > 0 ist, wiederholt man dies für die Zahlen B (anstelle von A) und R (anstelle von B)
- Andernfalls beendet man das Verfahren.
- Der aktuelle Wert von B ist die Lösung.
algorithmusEuklid(↓A, ↓B, ↑GGT)beginnfallsA < Bdannvertausche Werte von A und B;
- R ← A mod B;
wiederhole, solangeR > 0beginn- A ← B;
- B ← R;
- R ← A mod B;
ende
- GGT ← B;
endeEuklid
Struktogramm

Beispielaufgabe größter gemeinsamer Teiler:
public int ggt(int A, int B){
if (A < B){
int temp = A;
A = B;
B = tmp;
}
int R = A % B;
while (R > 0){
A = B;
B = R;
R = A % B;
}
return B;
}
Beispiel Klassenkarte Kreis
Vererbung
- wesentliches Ziel der Objektorientierung: Wiederverwendung von Code
- Verwendung der Funktionalität: Aufruf von Methoden anderer Klassen
- Aggregation/Komposition: Einbau von Objekten anderer Klassen als Attribute in eigene Klassen
- Spezialisierung/Generalisierung: Erweiterung anderer Klassen durch zusätzliche bzw. modifizierte Attribute und Methoden
objektorientierte Klassenhierarchie
- Spezialisierung wird in objektorientierten Sprachen durch eine Klassenhierarchie mit Vererbung realisiert
- Wurzel der Klassenhierarchie:
java.lang.Object - hat keine Attribute, aber einige Methoden, u.a.
public boolean equals()public String toString()protected Object clone()protected void finalize()public int hashCode()public int getClass()
- Idee: Man nehme eine existierende (Ober-)Klasse, leite eine neue (Unter-)Klasse davon ab
- Unterklasse erbt/besitzt alle Instanzvariablen und Methoden der Oberklasse
- modifiziere die geerbte Implementierung bzw. erweitere das Attribute- und Methodenangebot
- Überladen bei Vererbung: Unterklassen verfügen über alle Methoden ihrer Oberklassen mit unterschiedlichen Signaturen (Zugriff aber nur bei Sichtbarkeit)
- Überschreiben: Eine geerbte Methode wird durch eine neu vereinbarte Methode mit gleicher Signatur "überschrieben"
- auf die überschriebene Methode der direkten Oberklasse kann man mit
super.methodenName()zugegriffen werden - Achtung: Mehrfach überschriebene Methoden höherer Oberklassen sind nicht mehr erreichbar
- Man sagt auch: Eine Unterklasse erbt von mehreren Oberklassen
- Was vererbt wird: Alle öffentlichen (nicht privaten) Attribute und Methoden
- Formen: Mehrfachvererbung der Implementierung und Mehrfachvererbung der Spezifikation
- In Java gibt es keine Mehrfachvererbungen
Vorteile und Besonderheiten
- Vorteile:
- Wiederverwendbarkeit
- keine Quellcode-Duplizierung notwendig
- Fehlerkorrekturen bzw. Änderungen an einer Oberklasse wirken sich automatisch auch auf alle Unterklassen aus
- Grundlage der Polymorphie
- Besonderheiten:
- Es werden immer alle Instanzvariablen und Methoden geerbt (keine Auswahl möglich)
- Konstruktoren werden nicht vererbt
- Java unterstützt keine Mehrfachvererbung
- Klassenvariablen werden nicht vererbt (dupliziert), sind jedoch in der Unterklasse zugreifbar
- Jede Klasse wird implizit von einer Klasse
Object

Telefon
package vererbung;
public class Telefon {
private int rufnummer;
public Telefon (){
rufnummer = 1;
}
public Telefon(int rufnummer){
this.rufnummer = rufnummer
}
public void klingeln(){
System.out.println("Ring");
}
public int getRufnummer() {
}
}
Smartphonepackage vererbung;
public class Smartphone extends Telefon {
private String netz;
private String marke;
public Smartphone(int rufnummer){
super(rufnummer); //super -> Elternklasse
//super()-> steht im Konstruktor an 1. Stelle
netz = "HSMW Netz";
marke = "HSMW Mobil";
}
public void klingeln() {
System.out.println("La La");
super.klingeln();
}
}
class Tester SmartphoneTester
package tester;
import vererbung, Smartphone;
public class SmartphoneTester{
public static void main(String[] args){
Smartphone tel = new Smartphone(123456789);
System.out.println(tel.getRufnummer());
tel.klingeln();
}
}
Interface - definiert die Schnittstellen zu Methoden (keine Implementierung)
- besteht aus statischen Attributen (automatisch
final public static) und (implizit) abstrakten Methoden (public abstract) - Definition wird mit dem Schlüsselwort
interfaceeingeleitet - Eine Klasse kann beliebig viele Informationen implementieren

Abstrakte Klassen
- Spezielle Klassen, die über das Schlüsselwort
abstractdeklariert werden und können eine oder mehrere abstrakte Methoden besitzen - Abstrakte Methode besitzt eine Signatur aber keinen Rumpf (fehlende Methodendefinition)
- von abstrakten Klassen können keine Exemplare erzeugt werden
- für erbende Unterklassen gilt: Sie müssen alle geerbten abstrakten Methoden implementieren oder sind ebenfalls abstrakt
- Dienen der Modellierung abstrakter Begriffe bzw. Verallgemeinerungen
Generics
- Allgemeine Vorlagen
- Formal-Parameter als Platzhalter
- Aufruf erfolgt Aktual-Parametern
- Java-Collection-Framework verwendet Generics
Anwendung:
public class XYZ<T>{...} Aufruf:
XZY<String> abc = new XYZ<String>(); //Objekt abc ist nur für String
classVertauschen
package tester;
public class Vertauschen <T> {
private T wertA;
private T wertB;
/**
* @return the wertA
*/
public T getWertA() {
return wertA;
}
/**
* @param wertA the wertA to set
*/
public void setWertA(T wertA) {
this.wertA = wertA;
}
/**
* @return the wertB
*/
public T getWertB() {
return wertB;
}
/**
* @param wertB the wertB to set
*/
public void setWertB(T wertB) {
this.wertB = wertB;
}
public void tausche() {
T tmp = wertA;
wert A = wertB;
wertB = tmp;
}
}
Zeichen
- Datentyp:
char - Wertebereich: 16-Bit Unicode-Zeichen (ca. 35.000 Zeichen vergeben)
- Sonderzeichen (Auswahl):
t,n,f,",\- -> basiert auf American Standard Code of Information Interchange (ASCII)
- 7-Bit Code für 128 Zeichen
- 8. Bit früher als "Prüfbit", heute für Erweiterung wie Latin-1/ISO 8859-1
- UNICODE-Zeichen Tabelle: https://unicode-table.com/de/
- Zeichenketten sind Darstellungen des Referenzdatentyps
String - bis Java 8:
- JVM benutzt
Bytes(UTF-16 Codierung) -> 2 Bytes für Zeichen char-arrayals Repräsentation desStrings
- JVM benutzt
- ab Java 9:
- optimierte Nutzung durch "
compact strings" - bei ISO-8859-1/-Latin 1
- optimierte Nutzung durch "
String zeichenkette1 = "abc";
String zeichenkette2 = new String("abc");
char[] daten = {'a','b','c'};
String zeichenkette3 = new String(daten);
- ab Java 15
String s="""
Hallo
"""; printf()
- Formatierung der Ausgabe auf der Konsole
System.out.printf(<Format>, <Werte>);System.out.printf(<Lokalisierung>, <Format>, <Werte>);- Bezeichner:
- %s -> für Zeichenketten
- %d -> Ganzzahlen
- %f -> Gleitkommazahlen
- %t -> Zeilen/Daten
- einzelne Zeichen können mittels
charAt()extrahiert werden - um Teile zu extrahieren, wird die Methode
substring()benutzt
- arbeitet mit veränderbaren Zeichenkettenobjekten
- Entfernen/Bearbeiten/Löschen von Zeichen erzeugt kein neues Objekt
String |
StringBuffer |
StringBuilder |
||||
|---|---|---|---|---|---|---|
| Speicherung | Java String Pool | Java Heap Space | ||||
| Modifizierbar | Nein | Ja | Ja | |||
| Threadsicher | Ja | Ja | Nein | |||
| Geschwindigkeit | Schnell | Langsam | Schnell | |||
| Anwendung | Wenn nicht oft etwas geändert wird | Wenn oft etwasgeändert in mehreren Threads | Wenn oft etwas in einem Thread geändert wird |
Zufallszahlen - Berechnung in JAVA
-> Lehmer (1948): lineare Kongruenz
Große Zahlen in Java
BigDecimal- für Gleitkommazahlen
- Bestandteile
- nicht skalierter Wert
- Skalierungsfaktor
BigInteger- für Ganzzahlen
-
-2^{Integer.MAX_VALUE}... +2^{Integer.MAX_VALUE}
- PRNG - Pseudorandom Number Generator
- Unterteilung:
- Legacy -> einfache Algorithmen
- LXM -> Kombination aus Legacy und Sub-Generatoren
- Xoroshiro/Xoshiro -> XOR, Rotate, shift, rotate
- Unterteilung:
Array
- spezielle Objekte zum Speichern von mehreren Variablen eines gleichen Grundtyps
- Anzahl der Elemente wird erst beim Erstellen festgelegt
- Deklaration
int[] zahlen;oderint zahlen[];
- Definieren
zahlen = new int[4];- ↳ es existieren nun die Felder 0 bis 3
- Auffüllen
zahlen[0] = 2;zahlen[1] = 0;zahlen[2] = 1;zahlen[3] = [9];- oder
int zahlen2[] = {2,0,1,2}
- ACHTUNG: Beim Erstellen eines Array mit
newwerden alle Felder mit Standardwerten vorbelegt (numerische Werte: 0; Boolean:false, bein Objekten:NULL)
- Allgemein:
Datentyp variable = Feld vom Datentyp[index];
- Beispiel:
int z = zahlen[3];->zist 9int z = zahlen[4];-> FehlermeldungArray Index Out Of Bounds- Wichtig: Das erste Element eines Array hat immer den Index 0!
- darf nur am Ende der Parameterliste stehen, da sonst keine Unterscheidung möglich
public class
VariableParameterliste{
public void berechneSumme(double... werte){
double summe = 0;
for(double wert : werte){
summe = summe +wert;
}
System.out.println(summe); } }
public static void gibWerteAus(String... s){
for(int i=0; i<s.length; i++){
System.out.println(s[i]);
}
}
public static void main(String[] args) {
gibWerteAus("a", "b");
gibWerteAus("a", "b", "c");
gibWerteAus("a", "b", "c", "d");
} ArrayList
- ArrayList ist eine Collection-Implementierung für eine Liste
- Die Anzahl der Elemente in einer ArrayList ist während der Proigrammlaufzeit dynamisch veränderbar
import Java.util.ArrayList;notwendig- wichtige Methoden:
add(Element)get(Index)
ArrayList<String> namen = new
ArrayList<String>();
namen.add("Asterix");
namen.add("Obelix");
namen.add("Miraculix");
namen.add("Idefix");
String name = namen.get(0);
System.out.println(name); Enumeration
- kurz
enum - Sonderform einer Klasse für Konstanten
- ↳ auch als Aufzählung bekannt
public enum Wochentage {
MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG,
SAMSTAG, SONNTAG
}
System.out.println()
Was ist ein Muster?
- Erfahrungswerte für die objektorienterite Programmierung
- geben bestimmten, sich wiederholenden ENtwicklungen einen Nanem
- GOF -> Gang of Four -> "Design Patterns. Elements of Reusable Object-Oriented Software"
- Grundmuster (nach GoF):
- Erzeuger-Muster/Erzeugungsmuster
- Strukturmuster
- Verhaltensmuster
- Erweiterung:
- Objektrelationale Abbildung (object-relational mapping - ORM)
- Messaging Patterns
- Erzeuger-Muster
- Entkopplung der Konstruktion eines Objektes von der Repräsentation
- Auszug:
- Fabrikmethode
- Einzelstück
- Erbauer
- Prototyp
- Struktur-Muster
- Abbildungen von Beziehungen zwischen Entitäten
- Auszug:
- Adapter
- Stellvertreter/Proxy
- Fassade
- Verhaltensmuster
- Komplexes Verhalten von Software modellieren
- Auszug:
- Observer
- Iterator
- Visitor
- Auszug:
- Komplexes Verhalten von Software modellieren
Model-View-Controller
- Vorteile:
- Austausch der Benutzeroberfläche ist unabhängig vom Modell möglich
- verschiedene Benutzerschnittstellen können dasselbe Modell präsentieren
- Aufwandsabschätzung ist leichter
- Modell kann unabhängig vom Controller und View getestet werden
- Nachteil:
- Implementierungsaufwand erhöht sich
- Daten im Modell können durch unterschiedliche Benutzerschnittstellen gleichzeitig bearbeitet werden
- Verwendung:
- meistens reduzierte Umsetzung -> View + Controller in einem
- Erweiterung zu beispielsweise: MVVM (Model-View-Viewmodel)
- Ein Lambda-Ausdruck ist eine Funktion, die nur aus Code bestehen, ohne dass sie einen Namen hat
- Sie stellt sicherlich die kürzeste Möglichkeit dar, um in Java eine Ereignisroutine zu schreiben
- Aufbau:
Parameter -> Befehl(e);
- Problem: Java soll plattformunabhängig sein,aber Grafik ist plattformabhängig! -> Lösung: AWT und/oder Swing
- AWT: abstract windowing toolkit (
java.awt + ...):- Komponenten der unterstützten Fenstersysteme werden durch einheitliche Objekte repräsentiert
- Die Darstellung erfolgt plattformabhängig durch das jeweilige Fenstersystem über sogenannte Peer-Klassen (direkte Repräsentation im Fenstersystem)
- Swing: (
javax.swing + ....)- definiert Java-eigene Komponenten
- Darstellung erfolgt plattformunabhängig in Java
- Aufbau von Oberflächen
- Bezugskoordinatensystem:
- Farbanpassung Monitor vs. Papier:
- Papierbasisfarbe: weiß
- Monitorbasisfarbe: schwarz
Module Info
- seit Java 9
- Möglichkeiten:
- Steuerung der Zugriffsrechte
- bessere Skalierbarkeit und Übersichtlichkeit
- Funktionen:
- Exports:
- Aufbau:
exportsPackagename; - gibt die entsprechenden
packagesfrei zum Zugriff für andere die dieses Modul nutzen
- Aufbau:
- Requires:
- Aufbau:
requiresModulname; - lädt das entsprechende Modul (
package) zur Benutzung
- Aufbau:
- Opens:
- Aufbau:
opensPackagename; - Paket wird zur Laufzeit zur Verfügung gestellt
- Aufbau:
- Exports:
Neu in JavaFX
- neue Graphic Pipeline für moderne GPUs
- Hardwarebeschleunigung wird unterstützt (Prism)
- neues Windowing Toolkit (Glass) für Prism
- Java2D-software-pipeline für nicht unterstützte Hardware
- reichliche Auswahl an Effekten und Zeichenelementen: Shadows, Blurs, Reflections, Effects, 2D- und 3D-transforms
- viele (mehr als 50 unterschiedliche UI-Komponenten)
- Skinning (Anpassung) mittels CSS3+ wird unterstützt
- JavaFX unabhängig von Java Swing/AWT
- arbeitet mit einem sog. Scene Graph
- bei diesem kommt das sogenannte Retained-Mode Rendering zum Einsatz. Hierbei kümmert ich ein Framework beziehungsweise eine Library um das Rendering (Gegenstück: Immediate-Mode Rendering)
- In JavaFX programmiert der Entwickler für eine "Bühne" (Stage), auf der er konkrete "Szenen" (Scenes) aufgeführt werden.
- Die grafischen Komponenten werden in "Container" (Panes) abgelegt. Das Konzept ist an die 3D-Modellierung angelehnt (Szenengraph).
VBox, HBox-> vertikale bzw. horizontale Ausrichtung der ElementeStackPane-> Ausrichtung der Elemente übereinander (default: Center)GridPane-> Ausrichtung an einer TabellenstrukturBoderPane-> Ausrichtung an Oben, Unten, Links, Rechts und MitteAnchorPane-> Aurichtung der Elemente nach den Kanten (Top, Left, Right, Bottom)TilePane-> Tabellenlayout von gleichen Zellgrößen
Events in Java
Interaktion in grafischen Oberflächen
- jede Komponente kann Interaktivität hinzugefügt werden
- Die GUI erkennt verschiedenste Interaktions-Ereignisse (Beispiele):
- Mausklick
- Mausbewegung, Drag-Bewegung
- Drücken der linken/rechten Maustaste
- Taste gedrückt, losgelassen
- Programme mit grafischer Benutzeroberfläche werden durch Benutzeraktionen mit Bedienelementen gesteuert
- Man spricht auch von "ereignisgesteuerten Programmen"
- Bedienelemente erzeugen bei Benutze**r-Aktionen bestimmte Ereignisobjekte
- Bedienelemente liefern die Ereignisobjekte an angemeldete Benutzer
MVVM
Model View ViewModel
- trennen zwischen Ansicht, Daten und deren Verarbeitung wie bei MVC
- JavaFX arbeitet speziell mit MVVM (aufgrund des Datenverbindungsmechanismus)
- Im Gegensatz zum Controller im MVC steuert ViewModel nicht die View, sondern stellt lediglich die Daten dafür bereit (Databinding)
- Die View benötigt keine hinterlegten Code
- Views lassen sich als FXMLs erstellen und mittel Property Binding mit der Geschäftslogik (Also ViewModel und Model) verbinden (uni- und bi-direktional)
- Einbinden eines Controllers/ViewModels
Properties/Binding in JavaFX
- Properties ermöglichen die Kopplung mit anderen Datenobjekten (Komponenten, Eigenschaften, ...)
- Bindings überwachen eine oder mehrere Werte -> bei Änderung anpassen
dieser
- einseitig
- wechselseitig
- Vordefinierte Arten
- Transitions (Auszug):
- Fade Transition -> Deckkraft
- Path Transition -> entlang eines Weges
- Fill Transition -> Farbwechsel
- Scale Transition -> Skalierung des Objektes
- Parallele und Sequentielle Ausführung
- Timeline Animationen
- Interpolation
- Transitions (Auszug):
- Schritte:
- zu animierendes Objekt anlegen
- Timeline anlegen
- Animation(en) anlegen
- Blend -> Kombination aus 2 Farbobjekten (Pixel) die ein neues Farbobjekt erstellen
- Bloom -> Strahleffekt
- Blur (Box, Motion, Gauss) -> Verwaschen von Bildern
- Reflection -> Reflektion
- Aufruf anhand der Frames des Bildschirms:
- 60Hz -> 60 Aufrufe/ Sekunde
- 120 Hz -> 120 Aufrufe/ Sekunde

Systembus
- Leistungsbündel zur Datenübertragung zwischen den Einheiten des Rechners
- Speicherzugriff und die Datenübermittlung zwischen Speicher und Prozessor erfolgen über einen gemeinsamen Weg, den Datenbus (durchgängige Adressierung)
- So entsteht hier eine Engstelle, der sogenannte "Flaschenhals/bottleneck"
- drei Teilbusse: Datenbus, Adressbus & Steuerbus
- Moderne Betriebssysteme geben dem Benutzer die Illusion, dass verschiedene Programme gleichzeitig ausgeführt werden (Multi-Tasking)
- Nebenläufigkeit der Programme wird normalerweise durch das Betriebssystem gewährleistet
- Wie? Auf einem Einprozessor-System wird beispielsweise alle \[n\] ms zwischen den laufenden Prozessen umgeschaltet (Zeitscheiben-Verfahren [Round Robin])
- Verantwortlich dafür ist ein Scheduler (Teil des Betriebssystems-Kern)
- Einsatzbereiche
- parallele Verarbeitung von Daten (z.B. Cloud Computing, Big Data Analyse)
- effiziente und parallel arbeitende Webserver
- Simulation realer Objekte oder Ereignisse
- Vorteile
- keine Blockierung des Systems durch langsame Operationen (I/O, Serveranfragen, Datenbankanfragen, ...)
- Ausnutzung von Multicore-Architekturen und verteilten Systemen
- unabhängiger Kontrollfluss, z.B. für grafische Oberflächen oder Garbage-Controller
- Synchronisation
- Verklemmung (Deadlocks) -> Threads warten auf Ressourcen
- Aushungern (Starvation) -> Thread kann dauerhaft nicht weiterlaufen
- Bedingung des wechselseitigen Ausschlusses: Jedes Betriebsmittel wird entweder von genau einem Prozess belegt oder ist verfügbar
- Ununterbrechbarkeitsbedingung: Die Betriebsmittel, die von einem Prozess belegt werden, können nicht von außen entzogen werden. Nur die Prozesse selbst können von ihnen belegte Betriebsmittel wieder freigeben
- zyklische Wartebedingung: Es existiert eine zyklische Kette von zwei oder mehreren Prozessen

Java - Sprachelemente für Nebenläufigkeit
- Für Nebenläufige Programme sieht die Java-bibliothek eine Reihe von Klassen, Schnittstellen vor:
- Thread: Jeder Laufende Thread ist ein Exemplar dieser Klasse.
- Runnable: Beschreibt den Programmcode, den die JVM parallel ausführen soll.
- Lock: Dient zum Markieren von kritischen Abschnitten, in denen sich nur ein Thread befinden darf.
- Condition: Threads können auf die Benachrichtigung anderer Threads warten.
Automatisisierte Tests
- in den meisten IDEs bereeits enthalten
- automatisierte und standardisierte Tests
- können an verschiedenen Stellen (vor/nach der Klasse, Methodenaufrufe, ...) im Code stattfinden
- mittels:
JUnit
Framework zum Testen von Java-Programmen
JUnit-Testmethoden
- JUnit bietet viele Testmethoden
- assertTrue(Boole'sche Bedinung)
- assertFalse(Boole'sche Bedingung)
- assertEquals(Soll-Wert, Ist-Wert);
- assertEquals(Soll-Wert, Ist-Wert, delta); mögliche Typen:
double,float - assertNull(Objekt)
- assertNotNull(Objekt)
- assertSame(Objekt 1, Objekt 2)
- assertNotSame(Objekt 1, Objekt 2)
- fail()
- Möglichkeit Java-Objekte zu Erstellen
Default-Eintrage vorhanden- Konstruktor mit Parametern
toStringhashCodeEquals- Methoden zum Lesen der Attribute
- Durchsuchen von Textobjekten auf das Vorhandensein eines Musters
- Ausführung mittels:
java.util.regex.Matcherjava.util.regex.Pattern
| Regex | Bedeutung |
|---|---|
| | | Oder-Verknüpfung |
| . | genau ein Zeichen |
| ^ | gesuchter Wert beginnt mit |
| $ | gesuchter Wert endet mit |
| /d | Zahlen |
| /s | Whitespace-Zeichen |
Beispielaufgaben/Übungsaufgaben:
public class CascadePrinterAufwärts {
public static void main(String[] args) {
printer();
}
public static void printer() {
for(int m = 0; m < 11; m++) {
for(int n = 0; n < m; n++) {
System.out.print("*");
}
System.out.println("");
}
}
}
*
**
***
****
*****
******
*******
********
*********
**********
public class CascadePrinterAbwärts {
public static void main(String[] args) {
// TODO Auto-generated method stub
printer();
}
public static void printer() {
for(int m = 0; m < 10; m++) {
for(int n = m; n < 10; n++) {
System.out.print("*");
}
System.out.println("");
}
}
}
**********
*********
********
*******
******
*****
****
***
**
*
Beispielaufgabe Firma/Bank/OOP:
Mitarbeiter.java
import java.util.concurrent.atomic.AtomicInteger;
public class Mitarbeiter {
private String name;
private String vorname;
private int id;
private static final AtomicInteger counter = new AtomicInteger(-1);
public Mitarbeiter(String name, String vorname) {
this.name = name;
this.vorname = vorname;
this.id = counter.incrementAndGet();
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setVorname(String vorname) {
this.vorname = vorname;
}
public String getVorname() {
return vorname;
}
public int getId() {
return id;
}
public String toString() {
return "Mitarbeiter: " + vorname + " " + name + " ID: " + id;
}
}
import java.util.ArrayList;
public class PersonalVerwaltung {
private ArrayList<Mitarbeiter> mitarbeiterListe;
public PersonalVerwaltung() {
mitarbeiterListe = new ArrayList<Mitarbeiter>();
}
public void mitarbeiterHinzufuegen(String name, String vorname) {
Mitarbeiter m = new Mitarbeiter(name, vorname);
mitarbeiterListe.add(m);
}
public void mitarbeiterEntfernen(Mitarbeiter m) {
for(int zaehl = 0; zaehl < mitarbeiterListe.size(); zaehl++) {
if(m == mitarbeiterListe.get(zaehl)) {
mitarbeiterListe.remove(zaehl);
}
}
}
public void listMitarbeiter() {
for(int cnt = 0; cnt < mitarbeiterListe.size(); cnt++) {
System.out.println(mitarbeiterListe.get(cnt));
}
}
}
MitarbeiterVerwaltung.java
public class MitarbeiterVerwaltung {
public static void main(String[] args) {
// TODO Auto-generated method stub
PersonalVerwaltung pv = new PersonalVerwaltung();
Mitarbeiter m1 = new Mitarbeiter("fdsga", "dgf");
System.out.println(m1);
pv.mitarbeiterHinzufuegen("Commandroggen", "Kunt");
pv.mitarbeiterHinzufuegen("Piclas", "Nechan");
pv.listMitarbeiter();
}
}
Allgemeine Java-Hilfe:
https://www.javaundoop.de/index.php
https://codegym.cc/de/groups/posts/getter-und-setter-in-java
