3 Objektorientierte Konzepte in Java 3.1 Klassendeklarationen Fragen an die Klassendeklaration: Wie heißt die Klasse? Wer darf auf die Klasse und ihre Attribute/Methoden zugreifen? Ist die Klasse eine Subklasse einer anderen Klasse? Welche Schnittstellen besitzt die Klasse? Welche Attribute und Methoden hat die Klasse? 1
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 Instantiierbar- 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 Deklaration von Attributen Java-Syntax: AttrModifiers opt Type VarDeclarators 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 = Klassenattribut (existiert nur einmal pro Klasse) nichts = Instanzattribut (einmal pro Instanz) 5
und seinen Status nichts = normales variables Attribut final = symbolische Konstante, Wert nach Initialisierung nicht mehr änderbar final-attribute eines Referenztyps verweisen immer auf dasselbe Objekt, das i.a. aber verändert werden kann. Referenz ist final, nicht das Objekt 3.2.2 VarDeclarators Liste von Variablennamen mit optionalen Initialisierern 6
Beispiele für Attributdeklarationen: public class Angestellter{ private static int letztevergebenepersonalnr; protected final int personalnr; public final Date geburtsdatum; private int fuehrerscheinnummer, ausweisnummer; 7
3.3 Deklaration von Methoden 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 Überladen von Methoden gleicher Name, unterschiedliche Paramterliste überladener Methodenname Beim Methodenaufruf wird die spezifischste Methode ermittelt und ausgeführt. Beispiel: public int dividiere(int zaehler, int nenner){ // Ganzzahldivision return zaehler/nenner; public double dividiere(double zaehler, double nenner){ return zaehler/nenner; 11
3.5 Deklaration von Konstruktoren Konstruktoren = spezielle Methoden, die den Namen der Klasse tragen keinen Ergebnistyp besitzen bei der Erzeugung von Objekten aufgerufen werden (s.u.) weitere Eigenschaften: keine Klassenelemente, d.h. können nicht vererbt oder überschrieben werden nicht static, abstract oder final Für jede Klasse X ohne explizite Konstruktoren wird Standardkonstruktor X(){ super(); erzeugt, der den Konstruktor der Superklasse aufruft. 12
super (...) = führt als erste Anweisung innerhalb eines Konstruktors den entsprechenden Konstruktor der Superklasse aus. this referenziert innerhalb einer Methode oder eines Konstruktors das Objekt, für das die Methode aufgerufen wurde. Beispiele: public class Person{ public final Date geburtsdatum; private int ausweisnummer; public Person(Date geburtsdatum, int ausweisnummer){ this.geburtsdatum = geburtsdatum; this.ausweisnummer = ausweisnummer; public Person(Date geburtsdatum){ this(geburtsdatum, 0); 13
3.6 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 Instanzvariablen mit Initialwerten ruft den zur übergebenen ActualParameterList passenden Konstruktor auf 14
Beispiel: Person chef = new Person(gebDatChef, 14542); 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 15
3.7 Realisierung von Vererbungsbeziehungen 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) 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 (und anderen Subklassen von A) zugreifen. Beispiel: Angestellter leitereinkauf, leitermarketing; Person mitarbeiter; Person mitarbeiter = leitereinkauf; System.out.println( mitarbeiter.geburtsdatum); 17
3.8 Überschreiben von Methoden in Subklassen Idee: Subklassen stellen speziellere Versionen der in der Superklasse definierten Methoden bereit, z.b. Berechnung des Gehalts. Realisierung: Subklasse implementiert eine Methode mit derselben Signatur und demselben Rückgabewert wie in der Superklasse Beim Aufruf der Methode über eine Objektreferenz wird zur Laufzeit die Klasse des Objekts ermittelt, auf das die Objektreferenz aktuell verweist, und die spezifischste, in der Klassenhierarchie am weitesten unten definierte Methode wird ausgeführt. dynamisches Binden 18
Beispiel: public class Angestellter{ protected double grundgehalt = 3000; public double gehalt(){ return grundgehalt; public class Abteilungsleiter extends Angestellter{ protected double zulage = 1200; public double gehalt(){ return grundgehalt + zulage; 19
Die Anweisungen Angestellter lteinkauf = new Abteilungsleiter(); System.out.println(ltEinkauf.gehalt()); erzeugen die Ausgabe 4200 20