Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
schule:klassen:2018:10bc:kap11 [2019/03/18 13:11] – [Abstrakte Klassen] martin | schule:klassen:2018:10bc:kap11 [2021/12/29 10:40] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Kapitel 11: Vererbung ====== | ||
+ | <WRAP center round info 60%> | ||
+ | **Merke:** \\ | ||
+ | Erbt eine Klasse („Unterklasse“) von einer anderen („Oberklasse“), | ||
+ | Im Klassendiagramm kennzeichnet man die Vererbung durch einen Pfeil mit nicht-ausgefülltem Dreieck als Spitze. Bei den Unterklassen gibt man im Diagramm nur diejenigen Attribute und Methoden an, die zusätzlich zu denen der Oberklasse hinzukommen. | ||
+ | </ | ||
+ | ===== Beispiel: Fahrzeuge ===== | ||
+ | {{ : | ||
+ | |||
+ | ==== Die Klasse Fahrzeug (Oberklasse): | ||
+ | <code java> | ||
+ | public class Fahrzeug | ||
+ | { | ||
+ | private int radAnzahl; | ||
+ | private double leistung; | ||
+ | private String marke; | ||
+ | | ||
+ | public Fahrzeug(String marke, int radAnzahl, double leistung){ | ||
+ | this.marke = marke; | ||
+ | this.radAnzahl = radAnzahl; | ||
+ | this.leistung = leistung; | ||
+ | } | ||
+ | |||
+ | public String gibDaten(){ | ||
+ | String s = "Daten des Fahrzeugs: | ||
+ | s = s + " | ||
+ | s = s + " | ||
+ | s = s + " | ||
+ | return s; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Die Klasse Auto (Unterklasse): | ||
+ | <code java> | ||
+ | public class Auto extends Fahrzeug | ||
+ | { | ||
+ | private boolean hatKlimaanlage; | ||
+ | | ||
+ | public Auto(String marke, boolean hatKlimaanlage, | ||
+ | super(marke, | ||
+ | this.hatKlimaanlage = hatKlimaanlage; | ||
+ | } | ||
+ | | ||
+ | public String gibDaten(){ | ||
+ | String s = super.toString(); | ||
+ | s = s + " | ||
+ | return s; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | ==== Die Klasse Motorrad (Unterklasse): | ||
+ | <code java> | ||
+ | public class Motorrad extends Fahrzeug | ||
+ | { | ||
+ | private boolean hatBeisitzer; | ||
+ | | ||
+ | | ||
+ | super(marke, | ||
+ | | ||
+ | this.hatBeisitzer = hatBeisitzer; | ||
+ | } | ||
+ | | ||
+ | public String gibDaten(){ | ||
+ | String s = super.toString(); | ||
+ | s = s + " | ||
+ | return s; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ===== Polymorphismus ===== | ||
+ | Die Klassen Auto und Motorrad überschreiben beide die Methode gibDaten() der Klasse Fahrzeug. Hat man eine Variable mit Datentyp Fahrzeug, so kann sie auf ein Objekt der Klasse Fahrzeug, | ||
+ | Ruft man für das Objekt die Klasse gibDaten() auf, so wird – je nach Objekt – die Methode der Klasse Fahrzeug, Auto oder Motorrad ausgeführt. | ||
+ | <WRAP center round info 60%> | ||
+ | **Merke:** \\ | ||
+ | Man spricht von Polymorphismus, | ||
+ | </ | ||
+ | |||
+ | === Beispiel: Liste von Fahrzeugen unterschiedlicher Klassen === | ||
+ | <code java> | ||
+ | public class FahrzeugTest | ||
+ | { | ||
+ | | ||
+ | public void test(){ | ||
+ | | ||
+ | Fahrzeug[] liste = new Fahrzeug[3]; | ||
+ | liste[0] = new Auto(" | ||
+ | liste[1] = new Motorrad(" | ||
+ | liste[2] = new Auto(" | ||
+ | | ||
+ | for(int i = 0; i < liste.length; | ||
+ | | ||
+ | Fahrzeug f = liste[i]; | ||
+ | System.out.println(f.gibDaten()); | ||
+ | System.out.println(); | ||
+ | | ||
+ | } | ||
+ | | ||
+ | | ||
+ | } | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Der Methodenaufruf '' | ||
+ | |||
+ | |||
+ | ===== Abstrakte Klassen ===== | ||
+ | <WRAP center round info 60%> | ||
+ | **Merke:** \\ | ||
+ | Deklariert man eine Klasse als abstract („Abstrakte Klasse“), so können keine Objekte dieser Klasse instanziert werden. \\ | ||
+ | Deklariert man eine Methode von ihr als abstract („Abstrakte Methode“) und lässt den Methodenrumpf (Programmcode) weg, so muss jede nicht-abstrakte Unterklasse der Klasse diese Methode implementieren. | ||
+ | </ | ||
+ | |||
+ | === Umgestaltung des obigen Beispiels === | ||
+ | Im obigen Beispiel ist es nicht sinnvoll, ein Objekt der Klasse Fahrzeug instanzieren. Gleichzeitig wollen wir jede Unterklasse von Fahrzeug dazu zwingen, die Methode gibDaten() zu implementieren. | ||
+ | |||
+ | |||
+ | ==== Die Klasse Fahrzeug (Oberklasse): | ||
+ | <code java> | ||
+ | abstract public class Fahrzeug | ||
+ | { | ||
+ | private int radAnzahl; | ||
+ | private double leistung; | ||
+ | private String marke; | ||
+ | | ||
+ | public Fahrzeug(String marke, int radAnzahl, double leistung){ | ||
+ | this.marke = marke; | ||
+ | this.radAnzahl = radAnzahl; | ||
+ | this.leistung = leistung; | ||
+ | } | ||
+ | |||
+ | protected String gibFahrzeugdaten(){ | ||
+ | String s = "Daten des Fahrzeugs: | ||
+ | s = s + " | ||
+ | s = s + " | ||
+ | s = s + " | ||
+ | return s; | ||
+ | } | ||
+ | | ||
+ | abstract public String gibDaten(); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | ==== Die Klasse Auto (Unterklasse): | ||
+ | <code java> | ||
+ | public class Auto extends Fahrzeug | ||
+ | { | ||
+ | private boolean hatKlimaanlage; | ||
+ | | ||
+ | public Auto(String marke, boolean hatKlimaanlage, | ||
+ | super(marke, | ||
+ | this.hatKlimaanlage = hatKlimaanlage; | ||
+ | } | ||
+ | | ||
+ | abstract public String gibDaten(){ | ||
+ | String s = gibFahrzeugdaten(); | ||
+ | s = s + " | ||
+ | return s; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | ==== Die Klasse Motorrad (Unterklasse): | ||
+ | <code java> | ||
+ | public class Motorrad extends Fahrzeug | ||
+ | { | ||
+ | private boolean hatBeisitzer; | ||
+ | | ||
+ | | ||
+ | super(marke, | ||
+ | | ||
+ | this.hatBeisitzer = hatBeisitzer; | ||
+ | } | ||
+ | | ||
+ | public String toString(){ | ||
+ | String s = gibFahrzeugdaten(); | ||
+ | s = s + " | ||
+ | return s; | ||
+ | } | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Zugriffsmodifikatoren (Access Modifiers) ===== | ||
+ | Die Schlüsselworte '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' |