Liste Programmieren – Java
Überblick
1
2
3
4
5
6
7
8
9
10
11
Was ist Java?
Klassen und Objekte
Vererbung
Schnittstellen
Innere Klassen
Exceptions
Funktionsbibliothek
Datenstrukturen und Algorithmen
Ein-/Ausgabe
Threads
GUI-Programmierung mit SWING
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
33
Liste Programmieren – Java
Überblick: 2. Klassen und Objekte
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Kapselung
Ein Stack von chars
Klassen
Statische Methoden und Attribute
Objekte erzeugen und zerstören
Objektreferenzen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
34
1
2. Klassen und Objekte
2.1 Einleitung
Motivation
Softwaresysteme sind in den letzten 15-20 Jahren immer komplexer
geworden
Dies erfordert ein immer höheres Abstraktionsvermögen, um die
Komplexität zu meistern
Hinzu kommt der Bedarf nach wiederverwendbarem Code
Weiterhin nimmt neben der eigentlichen Problemlösung die
Benutzeroberfläche einen immer höheren Stellenwert ein
Beides wird durch eine objektorientierte Vorgehensweise erleichtert
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
35
2. Klassen und Objekte
2.1 Einleitung
Objektorientiert heißt, dass
Objektorientierte Programmiersprachen verallgemeinern das
Typkonzept herkömmlicher Programmiersprachen:
Software als eine Kollektion von Objekten organisiert wird, die
beides,
Zustand (Datenstruktur) und
Verhalten (Funktionen)
in sich vereinen
Neben den (eventuell wieder strukturierten) Attributen (mit Werten)
können auch Methoden (Funktionen) Bestandteil der Datenstruktur
sein.
Klassen sind Mengen von Objekten mit der gleichen Struktur:
gleiche zugreifbare Komponenten (Attribute) und
gleiches Verhalten (ausführbaren Methoden).
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
36
2
2. Klassen und Objekte
2.1 Einleitung
Drei Schlüsselbegriffe
Vererbung:
Kapselung,
Vererbung und
Polymorphismus.
Klassen können in einer Spezialisierungs-Hierarchie angeordnet
werden
Speziellere Klassen erben von allgemeineren deren Struktur und
Methoden
Kfz spezialisiert sich zu Pkw und Lkw.
Superklasse Bäume, Unterklassen Laubbäume, Nadelbäume.
Polymorphismus
Instanzen von verschiedenen Klassen aus einer gemeinsamen
Vererbungshierarchie zeigen
bei gleichnamigen Methodenaufrufen
unterschiedliches Verhalten
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
37
Liste Programmieren – Java
Überblick: 2. Klassen und Objekte
2.1
2.2
2.4
2.5
2.6
2.7
Einleitung
Kapselung: Ein Stack von chars
Klassen
Statische Methoden und Attribute
Objekte erzeugen und zerstören
Objektreferenzen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
38
3
2 Klassen und Objekte
2.3 Ein Stack von chars
Stack als Klasse
public class CharStack {
// Konstante
private final static int EMPTY = -1;
Klassenkonstante
// Attribute
private int top;
private int maxLen;
private char [] s;
// Methoden
public CharStack(int len) {
s = new char[len];
maxLen = len;
top = EMPTY;
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
Konstruktor
39
2 Klassen und Objekte
2.3 Ein Stack von chars
Stack als Klasse (fortgesetzt)
public void push(char c) {
top++;
s[top] = c;
}
public char pop() {
return s[top--];
}
Attribute gehören zur selben
Einheit wie Methoden
public char topOf() {
return s[top];
}
public boolean isEmpty() {
return (top == EMPTY);
}
public boolean isFull() {
return (top == maxLen-1);
}
};
© Prof. Dr. Björn Dreher
Methoden können Attribute
nutzen, ohne sie irgendwie
qualifizieren zu müssen
Liste Programmieren - Java
Methoden bearbeiten „ihre“
Attribute
Klasse ist Gültigkeitsbereich
der Bezeichner
40
4
2 Klassen und Objekte
2.3 Ein Stack von chars
Beispiel für Nutzung
CharStack data, operands;
Referenzen auf Objekte des
...
Typs CharStack
data = new CharStack(100);
operands = new CharStack(50);
...
Explizite Erzeugung des
data.push('1');
Objektes,
operand.push('+');
Wertzuweisung auf Referenz,
data.push('5');
Aufruf des Konstruktors
...
while (!data.isEmpty()) {
System.out.println(″Gepopped: ″ + data.pop());
...
Aufruf von Methoden
Kurze Schreibweise
CharStack data = new CharStack(100);
CharStack operands = new CharStack(50);
...
© Prof. Dr. Björn Dreher
41
Liste Programmieren - Java
2 Klassen und Objekte
2.3 Ein Stack von chars
Überladen einer Methode
Unterscheidung durch Signatur
Methodenname, Anzahl Parameter, Typen der Parameter
Rückgabetyp geht dabei nicht ein
Beispiel (wenn auch nicht sehr sinnvoll)
Zusätzliche Funktion pop mit einem int Parameter, der die Anzahl
von Elementen, die gepoppt werden sollen, angibt (Ergebnis ist nur
das letzte Element)
public char pop() {
return s[top--];
}
public char pop(int n) {
while (n-- > 1)
top--;
return s[top--];
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
n >= 1 angenommen
42
5
2 Klassen und Objekte
2.3 Ein Stack von chars
Aufrufe
data.pop();
data.pop(5);
// Standard pop Operation
// Mehrfache pop Operation
Wie bei jeder Objekt-Variablen werden durch
CharStack s, t, u;
zunächst nur drei Referenzen auf Stacks definiert
Die eigentlichen Objektinstanzen müssen noch erzeugt werden:
s = new CharStack(10);
t = new CharStack(100);
u = new CharStack(1000);
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
43
2 Klassen und Objekte
2.3 Ein Stack von chars
Für jede Instanz gilt:
Jede hat ihren privaten Datenbereich
Die Methoden können auf ihre Daten angewandt werden
Sie sind fester Bestandteil der Klasse
Zugriffsrechte
private
protected
package (kein Schlüsselwort!)
public
Genauer später!
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
44
6
Liste Programmieren – Java
Überblick: 2. Klassen und Objekte
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Kapselung
Ein Stack von chars
Klassen
Statische Methoden und Attribute
Objekte erzeugen und zerstören
Objektreferenzen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
45
2 Klassen und Objekte
2.4 Klassen
Eigene Klasse Socke:
class Socke {
public String
farbe;
public int
gewicht;
private boolean istTrocken;
public void trockne() {
istTrocken = true;
}
// Öffentlich sichtbar
// Öffentlich sichtbar
// Außen nicht sichtbar
// Methoden sind meist
// öffentlich
public void wasche() {
istTrocken = false;
}
public boolean istTrocken() {
return istTrocken;
}
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
46
7
2 Klassen und Objekte
2.4 Klassen
Eigene Klasse SockenDemo:
Nicht initialisierte Referenz
class SockenDemo {
public static void main(String args[]) {
Socke meineSocke;
meineSocke = new Socke();
Erzeuge neues Objekt
meineSocke.farbe = "rot";
Rufe Konstruktor auf
meineSocke.gewicht = 565;
Weise Referenz zu
meineSocke.wasche();
System.out.println("Ist die Socke trocken? " +
meineSocke.istTrocken());
}
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
47
2 Klassen und Objekte
2.4 Klassen
Parameterübergabe
Objekte immer als Referenzen:
class Waschmaschine {
static void auswaschen(Socke s) {
s.farbe = "weiß";
}
}
public class ZuOftGewaschen {
public static void main(String args[]) {
Socke omisSocke = new Socke();
omisSocke.farbe = "schwarz";
System.out.println(omisSocke.farbe);
Übergabe Objektreferenz
Waschmaschine.auswaschen(omisSocke);
System.out.println(omisSocke.farbe);
}
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
48
8
2 Klassen und Objekte
2.4 Klassen
Die this-Referenz
Wird (unsichtbar) an jeden Konstruktor und jede Methode übergeben
Zeigt auf aktuelles Objekt
Anwendungen
Nutzung überdeckter Objektvariablen (Attribute)
Hintereinanderschalten mehrerer Methodenaufrufe für dasselbe
Objekt
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
49
2 Klassen und Objekte
2.4 Klassen
Die this-Referenz
Nutzung überdeckter Objektvariablen (Attribute)
class Punkt {
int x, y;
void setzePosition(int x, int y) {
this.x = x;
this.y = y;
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
50
9
2 Klassen und Objekte
2.4 Klassen
Die this-Referenz
Hintereinanderschalten mehrerer Methodenaufrufe für dasselbe Objekt
public class GoOn {
private int value;
public int getValue() { return value }
public GoOn inc() {
value++;
return this;
}
Liefert Referenz auf sich
selbst zurück
public static void main(String args[]) {
System.out.println(new GoOn().inc().getValue()); // 1
GoOn ref = new GoOn();
ref.inc().inc().inc();
System.out.println( ref.getValue() );
...
© Prof. Dr. Björn Dreher
// 3
51
Liste Programmieren - Java
2 Klassen und Objekte
2.4 Klassen
Graphische Darstellung einer Klasse
„Unified Modeling Language“ (UML)
Name der Klasse
Socke
+farbe: String
+gewicht: int
-istTrocken: boolean
+trockne(): void
+wasche(): void
+istTrocken: boolean
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
Attribute
+ : public
- : private
Methoden
52
10
2 Klassen und Objekte
2.4 Klassen
Assoziation zwischen Klassen
Austausch von „Nachrichten“ zwischen Objekten
Objekte müssen sich „kennen“
Es besteht eine Assoziation zwischen ihnen
Wichtigstes Mittel zur Bildung von Objektverbänden
Socke
+farbe: String
+gewicht: int
- istTrocken: boolean
+produzent: Hersteller
produzent
Hersteller
Socke kennt Ihren Hersteller
Hier: Gerichtete Assoziation
Einfache Realisierung mit Hilfe einer Referenz „produzent“
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
53
2 Klassen und Objekte
2.4 Klassen
Klassen Socke und Hersteller:
class Socke {
public String
farbe;
public int
gewicht;
private boolean istTrocken;
public Hersteller produzent;
...
}
class Hersteller {
// ...
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
54
11
2 Klassen und Objekte
2.4 Klassen
Sichtbarkeiten
Innerhalb einer Klasse sind alle Attribute und Methoden sichtbar
Sichtbarkeit außerhalb der Klasse
private
von außen nicht zugreifbar
public
von überall außen zugreifbar
keine Angabe
protected (in Verbindung mit Vererbung)
von allen Klassen desselben Packages zugreifbar
Von allen Nachfahrenklassen und von allen Klassen desselben
Packages zugreifbar
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
55
2 Klassen und Objekte
2.4 Klassen
Sichtbarkeiten: Beispiel
class Password {
private String pass = "";
void setPassword(String oldpass, String newpass) {
if (oldpass != null && oldpass.equals(pass)) {
pass = newpass;
System.out.println("Passwort gesetzt!");
}
else
System.out.println("Passwort konnte nicht gesetzt "
+ "werden!");
}
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
56
12
2 Klassen und Objekte
2.4 Klassen
Sichtbarkeiten: Beispiel: Hauptprogramm
public class PassDemo {
public static void main(String args[]) {
Password pwd = new Password();
pwd.setPassword("", "Geheim");
pwd.setPassword("Geheim", "NeuGeheim");
System.out.println(pwd.pass);
// Fehler !!!
}
}
Attribut pass ist private!
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
57
2 Klassen und Objekte
2.4 Klassen
Sichtbarkeiten: Regeln
Attribute sind meistens private
Zugriff über public Methoden
Lokale Methoden können private sein
Gruppen von Klassen können über Default-Sichtbarkeiten (package)
miteinander kommunizieren
Bei Vererbung werden Methoden und Attribute, die von der
Nachfahrenklasse (und von Klassen im selben Package) verwendet
werden sollen, aber nicht von anderen Klassen, als protected
gekennzeichnet
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
58
13
2 Klassen und Objekte
2.4 Klassen
Zugriffsmethoden für Attribute
Direkter Zugriff kann von Nachteil sein
Einhaltung von Wertebereichen
Abhängigkeiten zwischen mehreren Attributen
Geheimnisprinzip für interne Realisierung
set-Zugriffsmethode kann dies sicherstellen
Kontostand und Soll/Haben-Attribut
Datentyp kann durch Zugriffsmethode abgeschottet werden
Übliche Vorgehensweise:
Attribute sind private
Es gibt öffentliche Zugriffsmethoden: get- und set-Methoden
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
59
2 Klassen und Objekte
2.4 Klassen
Zugriffsmethoden für Attribute
class Person {
private int age;
public int getAge() { return age; }
public void setAge(int age) {
if (age >= 0)
this.age = age;
}
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
60
14
Liste Programmieren – Java
Überblick: 2. Klassen und Objekte
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Kapselung
Ein Stack von chars
Klassen
Statische Methoden und Attribute
Objekte erzeugen und zerstören
Objektreferenzen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
61
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Normale Attribute und Methoden
Immer mit genau einer Objektinstanz verbunden
Attribute kennzeichnen den Zustand dieses Objektes
Methoden ändern oder lesen den Zustand dieses Objektes
Klassenattribute
Nicht mit bestimmter Objektinstanz verbunden
Gehört zur Klasse alleine
Existiert nur einmal pro Klasse
Gleich für alle Objektinstanzen
Integer.MAX_INTEGER
Math.PI
Math.E
Zähler der existierenden Instanzen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
62
15
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Klassenmethoden
Nicht mit bestimmter Objektinstanz verbunden
Gehört zur Klasse alleine
Unabhängig von Objektattributen
Kann sie nicht benutzen
Beispiele
Math.sin(double x)
Math.max(int a, int b)
main-Funktion einer Klasse
© Prof. Dr. Björn Dreher
Erzeugt oft erst eine Instanz der Klasse
Liste Programmieren - Java
63
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Realisierung von Klasseneigenschaften
Schlüsselwort static
Daher auch: Statische Eigenschaften
class LittleHelpers {
static double PI2 = Math.PI * Math.PI;
static double half(double x, double y) {
return (x+y)/2.0;
}
}
public class StaticUser {
public static void main(String args[]) {
System.out.println(
LittleHelpers.half(LittleHelpers.PI2, Math.E) );
}
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
64
16
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Statische Eigenschaften als Objekteigenschaften nutzen
Jedes Objekt hat auch Zugriff zu den Klasseneigenschaften
LittleHelpers lh = new LittleHelpers();
System.out.println( lh.PI2 );
System.out.println( LittleHelpers.PI2 );
Empfehlung: Zugriff über Klassenbezeichner
Klassenmethoden rufen üblicherweise wieder Klassenmethoden auf
Für Objektmethoden muss ein Objekt vorhanden sein
Klassenmethoden gibt es immer, wenn es die Klasse gibt
Objektmethoden sind nur aufrufbar, wenn es eine Objektinstanz gibt
Aus Objektmethoden können ohne weiteres Klassenmethoden
aufgerufen werden
© Prof. Dr. Björn Dreher
65
Liste Programmieren - Java
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Statische Methoden können nur auf Klassenattribute zugreifen
Es existiert für sie keine implizite Objektinstanz
Auch die this-Referenz steht nicht zur Verfügung
class Falsch {
int a;
static void klassenMethode() {
a = 1;
this.a = 2;
Falsch: Kein
Klassenattribut
}
}
Falsch: this-Referenz
existiert nicht
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
66
17
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Klassenattribute existieren nur einmal pro Klasse
Alle Objektinstanzen teilen sich diese Attribute
Alle Objekte können sie lesen und verändern
Könnte zum Austausch von Informationen zwischen Objekten benutzt
werden
Analog zu globalen Variablen bei herkömmlicher Programmierung
Problematiken:
Keine Kapselung
Fehlerverursacher schwer zu finden
Probleme bei nebenläufigen Zugriffen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
67
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Groß-/Kleinschreibung hilft beim Unterscheiden zwischen Klassenund Objekt-Eigenschaften
Klassennamen beginnen mit Großbuchstaben
Attribut- und Methodennamen beginnen mit Kleinbuchstaben
Math.max(a, b)
Math eine Klasse
max(a, b) ist Klassenmethode
Socke s = new Socke();
s.wasche();
s ist Objektreferenz
wasche() ist Objektmethode
System.out.println("Hello world!");
out ist Klassenattribut der Klasse System, referenziert ein Objekt
println(" ") ist Objektmethode dieses Objektes
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
68
18
2 Klassen und Objekte
2.5 Statische Methoden und Attribute
Konstanten
Statische Variablen mit dem Zusatz final
class SockenTyp {
static final int PUNKTIERT = 1,
GEFLECKT = 2,
GESTREIFT = 3;
}
Spätere Schreibzugriffe sind nicht möglich
Namen von Konstanten werden üblicherweise großgeschrieben
Unterstrich zur Trennung von Wortteilen: PI_QUADRAT
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
69
Liste Programmieren – Java
Überblick: 2. Klassen und Objekte
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Kapselung
Ein Stack von chars
Klassen
Statische Methoden und Attribute
Objekte erzeugen und zerstören
Objektreferenzen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
70
19
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Erzeugung
Mit dem new-Operator
Speicherbereich: Heap (Haufen), System-Speicherbereich für
dynamische Datenstrukturen
Vernichtung
In Java automatisch durch den Garbage-Collector
Wenn das Objekt nicht mehr referenziert wird
Garbage-Collector läuft im Hintergrund in bestimmten
Zeitabständen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
71
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Erzeugung im Detail
new-Operator legt Speicherbereich für Objekt aufgrund der
Klassendefinition an
Bestimmte Methode (Konstruktor) wird zur Initialisierung des Objektes
aufgerufen
Hat den Namen der Klasse (großgeschrieben, wie die Klasse)
Hat keinen Ergebnistyp
Wird oft mit verschiedenen Parameterversorgungen (Signaturen)
überladen
Initialisierung des Objektes zu einem konsistenten Zustand
Wenn kein anderer Konstruktor definiert ist, wird automatisch der
Default-Konstruktor erzeugt
Ohne Parameter
Macht nichts
Kann auch explizit definiert werden
Referenz auf Objekt als Ergebnis
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
72
20
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Konstruktor-Beispiel
class Socke {
Socke() {
farbe = "schwarz";
groesse = 40;
}
Default-Konstruktor
Socke( String farbe ) {
this.farbe = farbe;
groesse = 40;
}
Socke( String farbe, int groesse ) {
this.farbe = farbe;
this.groesse = groesse;
Aufruf:
}
Socke s1 = new Socke();
Socke s2 = new Socke("weiss");
private String farbe;
Socke s3 = new Socke("grau", 8);
private int groesse;
}
© Prof. Dr. Björn Dreher
73
Liste Programmieren - Java
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Anderen Konstruktor der gleichen Klasse aufrufen
Wiederverwendung von Code
class Socke {
Geht bei C++
nicht!
Socke( String farbe ) {
this.farbe = farbe; // this ist hier die Referenz auf
// das eigene Objekt
groesse = 40;
}
Socke() {
this( "schwarz" ); // this() leitet hier an anderen
// Konstruktor weiter
}
private String farbe;
private int groesse;
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
74
21
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Anderen Konstruktor der gleichen Klasse aufrufen
Wiederverwendung von Code:
Beispiel der Java Klasse Point
public class Point extends Point2D implements java.io.Serializable {
public int x, y;
public Point() {
this(0, 0);
}
public Point(Point p) {
this(p.x, p.y);
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
© Prof. Dr. Björn Dreher
75
Liste Programmieren - Java
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Anderen Konstruktor der gleichen Klasse aufrufen
Einschränkungen
Aufruf von this() muss in der ersten Zeile stehen
Als Parameter können an this() keine Objektattribute übergeben
werden
Attribute sind möglicherweise noch nicht präsent
Das Objekt wird gerade erst initialisiert
Möglich sind allerdings statische Konstanten
class Socke {
final int ringelAnzahl = 4;
static final int RINGEL_ANZAHL =
Socke( String g, int anzRingel )
Socke( String f ) {
// this( f, ringelAnzahl ); //
this( f, RINGEL_ANZAHL );
//
}
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
4;
{ ... }
nicht erlaubt
das geht statt dessen
76
22
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Default Initialisierung
Alle Attribute eines Objektes werden grundsätzlich mit Default-Werten
initialisiert
Primitive Datentypen: 0 oder false
Referenzen: null
Von Java garantiert
Initialisierung von Klassenattributen (statische Attribute)
Automatisch wie oben; nur einmal, wenn Klasse zum ersten Mal
geladen wird
Oder explizit:
class StaticInit {
static int i;
}
static {
i = 2;
}
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
77
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Finale Werte können auch noch im Konstruktor gesetzt werden
Nicht gut für Lesbarkeit des Codes
class VariableConstant {
final static int MWST; // hier steht nicht = irgendwas
final String ISBN;
// hier auch nicht.
static {
if ( 2 > 1 )
MWST = 7;
else
MWST = 16;
}
VariableConstant() {
ISBN = "3572100100";
}
public static void main( String args[] ) {
System.out.println( MWST ); // 7
}
}
System.out.println( new VariableConstant().ISBN );
// 3572100100
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
78
23
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Instanzeninitialisierer
...
private static final int NUMPTS = 100;
private int[] data = new int[NUMPTS];
{
for (int i = 0; i < NUMPTS; i++)
data[i] = i;
}
...
Es kann mehrere geben
Werden zu Beginn des Konstruktors ausgeführt
Nützlich für komplexe Initialisierungen
Hauptanwendung: Unterstützung anonymer innerer Klassen
(besprechen wir später)
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
79
2 Klassen und Objekte
2.6 Objekte erzeugen und zerstören
Zerstören von Objekten
Keine explizite Freigabe von Objekten wie in C (free) oder C++ (delete)
Nicht mehr verwendete Objekte (welche, zu denen es keine
Referenzen mehr gibt) werden von der Garbage Collection freigegeben
Thread niedriger Priorität, der immer im Hintergrund läuft
Referenz ungültig machen: Auf null setzen
In Java gibt es keine Destruktoren wie in C++
Teilweiser Ersatz
Methode finalize()
Keine Garantie, dass sie überhaupt einmal aufgerufen wird
Alles in allem: Eine bequeme Lösung für den Programmierer
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
80
24
Liste Programmieren – Java
Überblick: 2. Klassen und Objekte
2.1
2.2
2.3
2.4
2.5
2.6
2.7
Einleitung
Kapselung
Ein Stack von chars
Klassen
Statische Methoden und Attribute
Objekte erzeugen und zerstören
Objektreferenzen
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
81
2 Klassen und Objekte
2.7 Objektreferenzen
Null-Referenz
Point p = new Point();
p ist eine Referenz
Erhält Wert erst als Ergebnis des new-Operators
Point p = null;
null ist vordefinierte Konstante: null-Referenz
Sagt, dass p auf kein Objekt verweist
Typenlos: Kann jeder Referenz zugewiesen werden
Ist nicht in primitiven Datentyp 0 umwandelbar
Aufruf einer Methode oder eines Attributs einer mit null initialisierten
Referenz
NullPointerException
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
82
25
2 Klassen und Objekte
2.7 Objektreferenzen
Null-Referenz
Überprüfung, ob Referenz initialisiert ist:
if ( p != null && p.x >=10 ) ...
Zuweisung an Referenzen
Mehrere Referenzen können auf dasselbe Objekt zeigen
Point p = new Point();
Point q = p;
q erhält den Wert der Referenz p zugewiesen
Zeigt auf dasselbe Objekt
Objekt wird nicht kopiert!
Änderung über Referenz p betrifft genauso Referenz q
p.x = 10;
System.out.println(q.x);
© Prof. Dr. Björn Dreher
// Resultat ist 10
Liste Programmieren - Java
83
2 Klassen und Objekte
2.7 Objektreferenzen
Vergleich mit der Kopie von primitiven Werten
Primitive Variablen werden per Wert kopiert
int i = 2;
int j;
...
j = i;
System.out.println(j);
i = 3;
System.out.println(j);
© Prof. Dr. Björn Dreher
// Erhält Kopie des ursprünglichen
// Wertes zugewiesen
// Ergebnis ist 2
// Ergebnis ist immer noch 2
Liste Programmieren - Java
84
26
2 Klassen und Objekte
2.7 Objektreferenzen
Gleichheit von Objekten
Zuweisung mit = schafft zusätzliche Kopie einer Referenz auf ein
bereits existierendes Objekt
Vergleichsoperator == testet für alle Datentypen die Gleichheit der
entsprechenden Werte
Bei primitiven Datentypen liefert das erwartete Ergebnis
Bei Referenzen werden die Werte der Referenzen verglichen
Gleichheit, wenn sie auf dasselbe Objekt zeigen
Es wird nicht geprüft, ob die beiden referenzierten Objekte dieselben
Werte besitzen!
Point p =
p.x = 12;
Point q =
Point r =
r.x = 12;
if ( p ==
new Point();
p;
new Point();
q ) //
//
if ( p == r ) //
//
//
© Prof. Dr. Björn Dreher
ist wahr, da p und q dasselbe Objekt
referenzieren
ist falsch, da p und r zwei verschiedene
Punkt-Objekte referenzieren, die zufällig
dieselben Koordinaten haben
Liste Programmieren - Java
85
2 Klassen und Objekte
2.7 Objektreferenzen
Gleichheit von Objekten: Die Methode equals()
Jede Klasse kann diese Methode implementieren, um die Gleichheit
zweier verschiedener Objekte festzustellen
Damit definiert equals(), was für eine bestimmte Klasse Gleichheit
bedeutet
Point a = new Point( 10, 10 );
Point b = new Point( 10, 10 );
if ( a == b )
// false
...
if ( a.equals(b) ) // true
...
Bereits die Wurzelklasse Object definiert eine Methode equals()
Ergebnis ist true, wenn beide Argumente dasselbe Objekt
referenzieren
public boolean equals( Object obj ) {
return ( this == obj );
}
© Prof. Dr. Björn Dreher
Dasselbe, wie Vergleichsoperator (==)
Liste Programmieren - Java
86
27
2 Klassen und Objekte
2.7 Objektreferenzen
Gleichheit von Objekten: Die Methode equals()
Will man die eigenen Objekte auf Gleichheit vergleichen, muss man
equals() überschreiben
Für die Point-Klasse
public boolean equals( Object obj ) {
if ( obj instanceof Point ) {
Point pt = (Point)obj;
return (x == pt.x) && (y == pt.y);
}
return super.equals(obj); }
© Prof. Dr. Björn Dreher
Liste Programmieren - Java
87
28