Vererbung – Überschreiben von Methoden Vererbung – Überschreiben von Methoden public class Ellipse { public class Ellipse { float x, y, r, r2; float x, y, r, r2; public double umfang () { return Math.PI * ((this.r + this.r2) * 3 / 2 - Math.sqrt(this.r * this.r2)); } public double umfang () { return Math.PI * ((r + r2) * 3 / 2 - Math.sqrt(r * r2)); } } } – Dynamische Bindung (late binding) – Dynamische Bindung (late binding) – xxx.umfang() für Instanzen von Ellipse – xxx.umfang() für Instanzen von Ellipse – xxx.umfang() für Instanzen von Circle – xxx.umfang() für Instanzen von Circle Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 92 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 93 Vererbung – Dynamische Bindung (late binding) Vererbung – Überschreiben von Methoden public class Circle extends Ellipse { public double umfang () { return Math.PI * ((r + s) * 3 / 2 - Math.sqrt(r * s)); public double umfang () { return 2 * Math.PI * r; } double r; public double umfang () { return 2 * Math.PI * r; } } Ellipse e = new Ellipse(); Circle c = new Circle(); – Dynamische Bindung (late binding) … e.umfang() … … c.umfang() … – xxx.umfang() für Instanzen von Ellipse – xxx.umfang() für Instanzen von Circle Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 94 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 95 Vererbung (Typ-Subtyp-Beziehung) Vererbung – Dynamische Bindung (late binding) A ! Der Typ des Nachrichtenempfängers entscheidet, welche Methode aufgerufen wird. class B extends A { … } Ellipse e = new Ellipse(); Circle c = new Circle(); B – jedes B ist auch ein A, B ist Subtyp von A – überall, wo ein A erwartet wird, darf auch ein B auftauchen … e.umfang() … … c.umfang() … Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 96 Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 97 Vererbung – Dynamische Bindung (late binding) Vererbung (Typ-Subtyp-Beziehung) Ellipse e; Circle c; class Circle extends Ellipse { … } if (das_Wetter_ist_schoen()) e = new Ellipse(); else e = new Circle(); … e.umfang() … – jeder Kreis ist auch eine Ellipse, Circle ist Subtyp von Ellipse – überall, wo eine Ellipse erwartet wird, darf auch ein Kreis auftauchen Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) ! 98 Methodenauswahl zur Laufzeit parametrischer Polymorphismus Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 99 Vererbung (Struktursicht, Finalisieren von Klassen) Vererbung (Typsicht) Welche Komponenten hat eine Klasse ? class Circle extends Ellipse { … } Attribute (Instanzvariablen) – alle Attribute der Superklasse (und damit aller Superklassen) – alle eigenen (lokalen) Attribute (nur) Intuition : U Universum aller Objekte, Ellipse Menge von Objekten, die gewisse Merkmale ihrer Instanzen verlangt (x, y, r, r2, …) Also: Ellipse ⊆ U (alle Ellipsen sind Objekte) Analog: Circle ⊆ U. Circle verlangt mehr Merkmale (double r) als Ellipse, ist also eine kleinere Menge von Instanzen, also Circle ⊆ Ellipse Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 100 Methoden – alle Methoden der Superklasse, die nicht durch eine gleiche lokale Methode (Name und Signatur) überschrieben werden – alle lokalen Methoden Wolfgang Goerigk: Objektorientierte Programmierung in Java (SS 2009) 101