Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Save this PDF as:
 WORD  PNG  TXT  JPG

Größe: px
Ab Seite anzeigen:

Download "Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke"

Transkript

1 Institut für Programmierung und Reaktive Systeme Java 7 Markus Reschke

2 Vererbung in Java Vererbung ermöglicht es, Klassen zu spezialisieren Wiederverwendung vorhandener Klassen Kindsklasse erhält alle Attribute und Methoden der Elternklasse Syntax: class Kindsklasse extends Elternklasse... Objekte der Kindsklasse sind auch Objekte der Elternklasse Kindsklasse kann Methoden ändern (überschreiben), Zugriff auf Version der Elternklasse mit super Jede Klasse hat genau eine direkte Elternklasse, ohne Angabe Object

3 Ein schneller Counter 1 public class Counter { 2 private int count ; 3 4 public Counter ( int start ) { 5 this. count = start ; 6 } 7 8 protected setcount ( int count ) { 9 this. count = count ; 10 } public void increase () { 13 count ++; 14 } public int getcount () { 17 return count ; 18 } public void reset () { 21 count = 0; 22 } 23 }

4 Ein schneller Counter Wichtig: Kindsklasse darf nicht auf private Elemente der Elternklasse zugreifen! Wichtig: Konstruktoren werden nicht vererbt! setcount ist protected, damit die Unterklasse, den Counter freier setzen kann Alternativ: Mehrfache Benutzung von increase der Elternklasse 1 public class FastCounter extends Counter { 2 3 public FastCounter ( int start ) { 4 super ( start ); 5 } 6 7 public void increase () { 8 setcount ( getcount () + 2); 9 } 10 } 1 public void increase () { 2 super. increase (); 3 super. increase (); 4 }

5 Polymorphie Jedes Objekt einer Kindsklasse ist auch ein Objekt seiner Elternklassen. 1 Counter c = new FastCounter (0) ; Java löst Methodenaufrufe auf Objekte zur Laufzeit auf 1 c. increase (); // Ruft increase von FastCounter auf, obwohl c eine Counter - Referenz ist 2 System. out. println (c. getcount ()); // <- 2 Es wird die Methode des Typs des referenzierten Objektes aufgerufen, nicht die vom Typ der Referenz! Das Objekt selbst weiß, wie es was tun muss

6 Was passiert? 1 public class A { 2 public void say () { 3 System. out. println (" Klasse A"); 4 } 5 } 6 7 public class B extends A { 8 public void say () { 9 System. out. println (" Klasse B"); 10 } 11 } A a = new A(); 14 a. say (); 15 B b = new B(); 16 b. say (); 17 A b2 = new B(); 18 b2.say ();

7 == und Referenzen == vergleicht für Referenzdatentypen nur, ob beide Referenzen auf das selbe Objekt zeigen. 1 Counter a = new Counter (0) ; 2 Counter b = new Counter (0) ; 3 System. out. println (a == b); 4 Counter c = a; 5 System. out. println (a == c);

8 equals Alle Klassen erben von Object Object hat Methode public boolean equals(object o) Ohne Überschreiben wie == Kann in Unterklasse überschrieben werden, um wertemäßig zu vergleichen Da eine Referenz auf ein Object übergeben wird, muss man beim überschreiben auf zwei Sachen achten: null und den richtigen Typ o intanceof Klasse gibt true zurück, wenn o nicht null ist und ein Objekt vom Typ der angegebenen Klasse ist

9 Counter equals() 1 public class Counter { 2 public boolean equals ( Object o) { 3 if (!( o instanceof Counter )) { 4 return false ; // o null oder falscher Typ 5 } 6 Counter c = ( Counter ) o; 7 return c. getcount () == getcount (); 8 } 9 } Counter a = new Counter (0) ; 12 Counter b = new Counter (0) ; 13 System. out. println (a. equals (b)); 14 Counter c = a; 15 System. out. println (a. equals (c));

10 Abstrakte Klassen Klassen, von denen keine Objektinstanzen erzeugt werden können Baupläne für andere Klassen Sind mit abstract markiert. Können Methoden ohne Implementierung enthalten Diese Methoden müssen auch mit abstract markiert werden. Markus Reschke Java 7 10 Institut für Programmierung und Reaktive Systeme

11 Ein abstrakter Counter 1 public abstract class IntCounter { 2 private int count ; 3 4 public IntCounter ( int start ) { 5 this. count = start ; 6 } 7 8 protected setcount ( int count ) { 9 this. count = count ; 10 } public abstract void increase (); public int getcount () { 15 return count ; 16 } public void reset () { 19 count = 0; 20 } 21 }

12 Interfaces Interfaces geben an, über welche Methoden eine Klasse verfügt Es wird jedoch keine Implementierung mitgegeben. Eine Klasse kann beliebig viele Interfaces implementieren (im Vergeich zum Erben) Die Definition eines Interfaces wird mit interface eingeleitet. Klassen implementieren Interfaces mit implements. Interfaces sind Typen Gegen Interfacetyp programmieren Implementierungen einfach austauchbar 1 ZugriffsBeschraenker interface KlassenName { 2 // Statische Konstanten ( public, static, final sind implizit ) 3 int ANSWER = 42; 4 // Abstrakte Methoden ( abstract, public sind implizit ) 5 void foo (); 6 }

13 Demo Demo: UnaryCounter.java ICounter.java IntCounter.java Main.java Markus Reschke Java 7 13 Institut für Programmierung und Reaktive Systeme

14 Überblick und Ausblick Vererbung Polymorphie Abstrakte Klassen Interfaces Morgen: Binärer Suchbaum Markus Reschke Java 7 14 Institut für Programmierung und Reaktive Systeme