3 Objektorientierte Konzepte in Java Bisherige Beobachtungen zu Objekten: werden in Klassen zusammengefasst besitzen Eigenschaften und Verhalten verbergen private Informationen werden geboren, leben und sterben sind u.u. Spezialfälle allgemeinerer Objekte (Superklassen Subklassen) kommunizieren über definierte Schnittstellen stehen in Beziehung zu anderen Objekten Umsetzung in Java? 1
3.1 Klassen fassen Objekte zusammen. Java-Syntax: ClassModifiers opt class Identifier Super opt Interfaces opt ClassBody Beispiel: public class Tutor extends Student implements Korrektor, Klausuraufsicht { /* Attribute */ private String name ; /* Konstruktoren */ public Tutor ( String tutorname ){ name = tutorname; /* Methoden */ public String getname (){ return name ; public void korrigiere ( Uebungsblatt blatt ){ //... public void beaufsichtige ( Klausur klausur ){ //... /* Tutor */ 2
3.1.1 Identifier gibt Klassennamen an. Analog zu Variablennamen gilt: beginnt mit JavaLetter, gefolgt von JavaLetterOrDigit 3.1.2 ClassModifiers regeln die Zugreifbarkeit der Klasse public = von überall aus zugreifbar nichts = nur innerhalb des Pakets und die Instantiier- bzw. Ableitbarkeit. abstract = nicht instantiierbar, d.h. keine Objekte vom Typ der Klasse erzeugbar final = nicht ableitbar, d.h. keine Subklassen der Klasse erzeugbar 3
3.1.3 Super gibt genau eine Superklasse an. extends Identifier = deklarierte Klasse ist von der Klasse mit dem Namen Identifier abgeleitet 3.1.4 Interfaces gibt implementierte Schnittstellen (Interfaces) an. implements Interface1, Interface2,... = deklarierte Klasse implementiert die angegebenen Interfaces 3.1.5 ClassBody deklariert Attribute, Konstruktoren, Methoden, etc. 4
3.2 Attribute bilden Eigenschaften ab. Java-Syntax: AttrModifiers opt Type VarDeclarators Beispiel: public final int personalnummer; 3.2.1 AttrModifiers regeln die Zugreifbarkeit des Attributs, public = von überall aus zugreifbar nichts = innerhalb desselben Package protected = innerhalb desselben Package und in Subklassen private = nur innerhalb derselben Klasse seine Zugehörigkeit, static = Klassenvariable (existiert nur einmal pro Klasse) nichts = Objektvariable (einmal pro Objekt) 5
und seinen Status. nichts = normales variables Attribut final = symbolische Konstante, Wert nach Initialisierung nicht mehr änderbar 3.2.2 VarDeclarators Liste von Variablennamen mit optionalen Initialisierern 6
Beispiele für Attributdeklarationen: public class Angestellter{ private static int letztevergebenepersonalnr; public final Date geburtsdatum; private int fuehrerscheinnummer, ausweisnummer; 7
3.3 Methoden bilden Verhalten ab. Java-Syntax: MethodModifiers opt ResultType Identifier (FormalParameterList opt ) Throws opt MethodBody Beispiel: public static void main(string args[]) throws IOException{ //... 3.3.1 MethodModifiers regeln die Zugreifbarkeit public, nichts, protected, private wie bei Attributen 8
ihre Instantiierbarkeit nichts = Implementation der Methode definiert Objekterzeugung möglich abstract = nur Signatur der Methode (=Name sowie Anzahl und Typen der formalen Parameter) deklariert, keine Implementation Klasse ist implizit abstract ihre Zugehörigkeit static und nichts wie bei Attributen und ihre Überschreibbarkeit nichts = Methode in Subklassen überschreibbar final = Subklassen können Methode nicht überschreiben 9
3.3.2 ResultType gibt den Typ des Rückgabewerts der Methode an oder das Schlüsselwort void, falls die Methode keinen Wert zurückliefert. 3.3.3 FormalParameterList Liste der formalen Paramter mit Namen und Datentypen für jeden Parameter final deklarierte Parameter symbolische Konstanten in der Methode 3.3.4 Throws optionale Liste von Ausnahmen, die in der Methode erzeugt werden können 3.3.5 MethodBody Implementation der Methode (bei nicht abstract deklarierten Methoden) 10
3.4 Konstruktoren regeln die Geburt von Objekten. tragen den Namen der Klasse haben keinen Ergebnistyp werden bei der Erzeugung von Objekten aufgerufen (s.u.) weitere Eigenschaften: keine Klassenelemente, d.h. können nicht vererbt oder überschrieben werden nicht static, abstract oder final Beispiele: public class Person{ public final Date geburtsdatum; public Person(Date geburtsdatum){ this.geburtsdatum = geburtsdatum; 11
Für jede Klasse X ohne explizite Konstruktoren wird Standardkonstruktor X(){ super(); erzeugt, der den Konstruktor der Superklasse aufruft. super (...) = führt innerhalb eines Konstruktors den entsprechenden Konstruktor der Superklasse aus. Falls im Konstruktor kein super-aufruf angegeben ist, wird implizit super() als erste Anweisung ausgeführt. Im Beispiel: public Person(Date geburtsdatum){ super(); // implizit eingefuegt this.geburtsdatum = geburtsdatum; 12
3.5 Objektreferenzen und Erzeugung von Objekten Deklaration von Objektreferenzen mittels Type VarDeclarators; wie bei Attributen Beispiel: Person chef; Wirkung: chef referenziert ein Objekt vom Typ Person kein Initialisierer angegeben Initialwert null, d.h. Variable referenziert nichts Erzeugung eines Objekts: new Identifier(ActualParameterList opt ) reserviert Speicherplatz für das Objekt belegt die Objektvariablen mit Initialwerten ruft den zur übergebenen ActualParameterList passenden Konstruktor auf 13
Beispiel: Person chef = new Person(gebDatChef); Zugriff auf Attribute und Methoden von Objekten mit dem Punkt-Operator: Date chefsgeburtstag = chef.geburtsdatum; Beachte: Zugriffsversuch auf Attribute/Methoden über null-objektreferenzen führt zu einer NullPointerException! Beispiel: Person chef=null; Date chefsgeburtstag = chef.geburtsdatum; // NullPointerException 14
3.6 Finalizer regeln den Tod von Objekten. protected void finalize() throws Throwable{ //... aus der Superklasse geerbte Methode wird vom Garbage Collector unmittelbar vor der Zerstörung des Objekts aufgerufen Zweck: Aufräumarbeiten, z.b. Leeren von Puffern Schließen von Datei- und Datenbankverbindungen In eigenen finalize-methoden am Ende super.finalize() aufrufen! Aufräumarbeiten der Superklasse anstoßen 15
3.7 Super- und Subklassen Angabe (höchstens) einer Superklasse mittels extends in der Klassendeklaration, z.b. public class Angestellter extends Person Klasse Angesteller ist Subklasse von Person: erbt alle zugreifbaren Elemente von Person private-elemente nicht vererbt Konstruktoren nicht vererbt (sind keine Klassenelemente) Object ist Superklasse aller Klassen. 16
Wirkung: Jeder Angestellter ist eine Person (ist-ein Beziehung). technische Konsequenz: Mit einer Objektreferenz vom Typ Person kann man auf ein Objekt vom Typ Angestellter zugreifen. Beispiel: Angestellter leitereinkauf, leitermarketing; Person mitarbeiter; //... mitarbeiter = leitereinkauf; System.out.println( mitarbeiter.geburtsdatum); 17
3.8 Interfaces Interface = Schnittstelle, definiert Kommunikationsmöglichkeiten / Fähigkeiten / Verhalten Java-Syntax: InterfaceModifiers opt interface Identifier ExtendsInterfaces opt InterfaceBody Beispiel: public interface Rank{ public int compare(rank o); 3.8.1 InterfaceModifiers regeln die Zugreifbarkeit (wie bei Klassen) und die Instantiier- und Ableitbarkeit public oder nichts implizit abstract 18
3.8.2 InterfaceBody Methoden implizit abstract und public, nicht static und nicht final keine Implementation Variablen implizit public, static und final symbolische Konstanten 3.8.3 ExtendsInterfaces Angabe von (mehreren) Superinterfaces nach extends Vererbung ähnlich wie bei Klassen: Subinterface erbt alle Konstanten und die Methoden, die es nicht überschreibt. 19
3.8.4 Implementation von Interfaces Klassen, die ein Interface implementieren, müssen den Interfacenamen in der Klassendeklaration aufführen Implementationen für alle Methoden des Interface bereitstellen (sonst abstrakte Klasse) Beachte: Eine Klasse kann mehrere Interfaces implementieren. Die Klasse erbt die symbolischen Konstanten des Interface. 20
Beispiel: public interface Comparator{ public int compareto( Object o1, Object o2 ); public boolean equals ( Object o); Implementierende Klasse: public class PersonComp implements Comparator{ public boolean equals ( Object o){ Person p = ( Person )o; return ( this. gehalt () == p. gehalt ()); PersonComp muss abstract deklariert werden, sonst Übersetzungsfehler. Wann sind zwei Personen gleich? 21
3.9 Zusammenfassung Objekte in Java werden in Klassen zusammengefasst class Person besitzen Eigenschaften und Verhalten Attribute und Methoden verbergen private Informationen public, protected, private werden geboren, leben und sterben Konstruktoren, Objektreferenzen, Finalizer sind u.u. Spezialfälle allgemeinerer Objekte Angestellter extends Person kommunizieren über definierte Schnittstellen Interface Comparator stehen in Beziehung zu anderen Objekten nächste Große Übung (01.02.06) 22