2. Klassen und Objekte

Werbung
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
Herunterladen