If you can't read please download the document
Author
hoangcong
View
219
Download
1
Embed Size (px)
Prof. Dr. Nikolaus Wulff
Java SchulungJava Schulung
Objektorientierte Programmierung in JavaTeil III: Java Klassen und Objekte
Prof. Dr. Nikolaus Wulff 2
Referenzvariablen
a
bnull
00
Referenzvariablen verweisen auf(unbenannte) Objekte im Speicher.
Uninitialisierte Variablen enthalteneine Null-Referenz (null).
Objekte werden zur Laufzeit erzeugt.
Objekte sind anonym.
Sie haben eine unvernderliche Identitt.
Point a,b;
new Point(0,0);
aObjekt
a 12
a = new Point(1,2);
:Point
a:Point
Prof. Dr. Nikolaus Wulff 3
Binden von Referenzvariablen
a
b
00
34
Beim Zuweisen eines Objektes auf eineVariable wird eine Referenz zugewiesen:
Beim Zuweisen von Referenzvariablenaufeinander werden nur die Referenzenkopiert, nicht die Objekte:
Vorsicht! Das Objekt kann jetzt ber zweiPfade gendert werden:
a = new Point(0,0);b = new Point(3,4);
a.set(5,6);b.set(20,30);
a = b; ab
00
34
2030
Prof. Dr. Nikolaus Wulff 4
Vergleichen von Objekten
a
b34
34
c
a == b
a != c
d d == null
Beim Vergleichen zweier Referenzvariablen werden die Referenzen verglichen, nicht die referenzierten Objekte. Es wird also auf Objektidentitt, nicht auf Inhaltsgleichheit geprft.
==(shallow equality)
Prof. Dr. Nikolaus Wulff 5
Inhaltsvergleich
Der Inhalt von zwei Objekten wird durch die Methode equals verglichen.
Bei selbstdefinierten Klassen vergleicht equals (geerbt von Object) per Default auch nur die Objektidentit, d.h. verwendet shallow equality.
Die Methode equals muss selbst neu berladen werden, damit sie die gewnschte Funktionalitt bietet.
new Integer(1) != new Integer(1)new Integer(1).equals(new Integer(1))
equals(deep equality)
Prof. Dr. Nikolaus Wulff 6
Eine Klasse
class Cell { private int value = 0; void setValue(int newValue){ this.value = newValue; } int getValue( ) { return this.value; } ...}
Methoden
Attribut
Klassen-
definition
Prof. Dr. Nikolaus Wulff 7
Bestandteile einer Klasse
Einleitung einer Klasse durch Schlsselwort class:
Erzeugung eines Objektes mit new:
Attribute:
class EineKlasse { /* Klassenrumpf */ }
EineKlasse a = new EineKlasse();
class Datengrab { int i; float f; boolean b;}
Jede Instanz (jedes Objekt) der Klasse Datengrab bekommt eine eigene Kopie der Attribute.
Prof. Dr. Nikolaus Wulff 8
Methoden
Methoden: Verhalten eines Objekts Inspizieren und ndern den Zustand eines Objekts. Berechnen von Rckgabewerten. Anstoen von weiteren Methoden ber das Senden von
Nachrichten an andere Objekte. In anderen Sprachen: Funktionen oder Prozeduren. Nur innerhalb von Klassen (keine Methode ohne Klasse!).
Aufruf einer Methode = Senden einer Nachricht:
int x = a.f(); rufe Methode f von Objekt a bzw.sende Nachricht f an Objekt a
Prof. Dr. Nikolaus Wulff 9
Organisatorisches Hands on Tutorien jeweils Mittwochs 15 17 Uhr
im Lab4Inf D117 mit Rene Brggemann. Praktikumverschiebung Informatiker Donnerstags
von 13 17 auf 14 18 Uhr Pool 3.
Prof. Dr. Nikolaus Wulff 10
Parameterliste
Die Parameterliste spezifiziert die Typen der Objekte, die als Argumente an die Methode bergeben werden knnen.
Jedes Objekt (Parameter) erhlt einen lokalen Namen, ber den innerhalb der Methode auf das Objekt zugegriffen werden kann.
Beachte: Es werden nicht die Objekte (Kopien), sondern Referenzen auf die Objekte bergeben!
Cell aCel1 = new Cell();aCel1.setValue(4);reset(aCel1);aCel1.getValue();
void reset(Cell c) { c.setValue(0);}
Typ Name
==> 0
Prof. Dr. Nikolaus Wulff 11
Rckgabewerte
Methoden knnen Werte bzw. Objektreferenzen zurckliefern:
Mit return wird die Methode sofort verlassen - auch wenn noch Befehle dahinter folgen!
Methoden ohne Rckgabe haben den Rckgabetyp void:
Integer berechne(int a, int b) { int sum = a + b; return new Integer(sum);}
Rckgabetyp
Rckgabe
void print(int a, int b) { System.out.println("a + b = " + (a + b));}
Prof. Dr. Nikolaus Wulff 12
Methodenrumpf
Variablendeklarationen und -zuweisungen.
Beachte: Lokale Variablen mssen initialisiert werden!
void berechne() { int i; i++;}
Compile-Fehler!
void berechne(int a, int b) { int i; i = a * b;} Zuweisung
Deklaration
Prof. Dr. Nikolaus Wulff 13
Statische Attribute und Methoden
Attribute und Methoden, die nicht fr einzelne Objekte, sondern fr die ganze Klasse definiert sind.
D.h., jedes Attribut kommt nur einmal pro Klasse vor!
Statische Attribute und Methoden knnen genutzt werden, ohne Objekte zu erzeugen. Der Zugriff erfolgt ber den Klassennamen:
class Person { static int erzeugtePersonen = 0; static void printStatistik() { System.out.println("Erzeugt: " + erzeugtePersonen); }}
Person.printStatistik();Person.erzeugtePersonen++;
Vergleiche: System.out.println(...); main
Prof. Dr. Nikolaus Wulff 14
Statische Attribute
class Person { static int erzeugtePersonen = 0; String name;}
Person
erzeugtePersonen = 0
peter
class
name = Peter
mary
class
name = Mary
Objekte mit Attributen
Klasse mit statischen Attribut
das Objekt kennt seine Klasse
Prof. Dr. Nikolaus Wulff 15
Konstanten
Konstanten = finale Werte von Basisdatentypen Konstanten zur bersetzungszeit werden vom Compiler ausgewertet:
Konstanten zur Laufzeit sind nach der Initialisierung unvernderlich:
final static: nur ein Wert pro Klasse, der seinen Wert nach dem ersten Laden der Klasse nicht mehr ndert.
finale Referenzen: knnen nicht mehr an andere Objekte gebunden werden
final int ANZAHL_MONATE = 12;
final int ZUFALL = (int)(Math.random() * 20);
final Integer NULL = new Integer(0);
Prof. Dr. Nikolaus Wulff 16
this und super Auf das aktuelle Objekt, auf dem die Methode
ausgefhrt wird (an das die Nachricht gesendet wurde), kann ber das Schlsselwort this zugegriffen werden.
Auf das direkte Elternobjekt kann innerhalb einer Methode mit super zugegriffen werden.
Achtung: In statischen Methoden gibt es kein this!
Prof. Dr. Nikolaus Wulff 17
berladen von Methoden
Eine Nachricht mit mehreren Signaturen und Methodenimplementationen.
Die Methode wird (statisch) beim Senden der Nachricht anhand der Parameter ausgewhlt.
class SuperWasher { void wash(Shirt s) { ... } void wash(Car c) { ... } void wash(Dog d) { ... } ...}
SuperWasher sw = new SuperWasher();Dog aDog = new Dog();sw.wash(aDog);
Prof. Dr. Nikolaus Wulff 18
Kein berladen bei Rckgabewerten
Folgende berladene Methoden unterscheiden sich nur im Rckgabewert:
Das geht nicht, denn der Compiler kann fr diesen Aufruf nicht bestimmen, welche Methode zu verwenden ist:
void washAll() {...}int washAll() {...}
washAll();
Prof. Dr. Nikolaus Wulff 19
Default-Konstruktor
Konstruktoren dienen zur Erzeugung und Initialisierung von Objekten einer Klasse.
Wenn kein Konstruktor angegeben wird, ist implizit ein Default-Konstruktor (ohne Parameter) definiert.
Aufruf des Konstruktors beim Erzeugen des Objekts:
class Bird { String name;}
Bird nc = new Bird();
class Bird { String name;
Bird() { super(); }}
Aufruf der Konstruktorsder Superklasse
Prof. Dr. Nikolaus Wulff 20
Konstruktordefinition
Konstruktoren knnen berladen werden und Parameter erhalten, z.B. zur Initialisierung von Attributen:
class Worker extends Person { String name;
Worker() { super(); name = "Noname"; System.out.println("Erzeuge Noname"); };
Worker(String name) { super(); this.name = name; System.out.println("Erzeuge " + name); }} Worker noname = new Worker();Worker peter = new Worker("Peter");
Aufruf des Super-Konstruktors ist optional(erfolgt sonst automatisch vom Compiler)
Prof. Dr. Nikolaus Wulff 21
Konstruktorverkettung
Konstruktoren knnen sich gegenseitig aufrufen:
Konstruktoren knnen Konstruktoren der Superklasse aufrufen:
class Person { ... Person(String name, int alter) { this(name); ... }}
Konstruktor dieser Klassemit Parameter String aufrufen
class Mitglied extends Person { ... Mitglied(String name, int tarifgruppe) { super(name); ... }}
Konstruktor der Superklassemit Parameter String aufrufen
Prof. Dr. Nikolaus Wulff 22
Konstruktoraufrufe
PersonAngestellter
Beim Erzeugen eines Objektes einer Subklasse wird automatisch der Default-Konstruktor der Superklasse aufgerufen.
class Person { Person() { System.out.println(" Person"); }}class Angestellter extends Person { Angestellter() { System.out.println(" Angestellter"); }}
Angestellter peter = new Angestellter();
Ausgabe:
Prof. Dr. Nikolaus Wulff 23
Konstruktor mit Argumenten
Ein Konstruktor der Superklasse mit Argumenten muss als erstes im Konstruktor explizit (ber super)
aufgerufen werden.
class Person { Person(String name) { System.out.println(" Person " + name); }}
class Angestellter extends Person { Angestellter(String name) { super(name); System.out.println(" Angestellter " + name); }}