Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
schule:klassen:2018:10bc:kap11 [2019/03/18 13:11] – [Abstrakte Klassen] martinschule: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“), so übernimmt sie alle ihre Methoden und Attribute.   \\ 
 +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.
 +</WRAP>
  
 +===== Beispiel: Fahrzeuge =====
 +{{ :schule:klassen:2018:10bc:vererbung_beispiel_fahrzeuge.png |}}
 +
 +==== 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:\n";
 +        s = s + "Marke: " + marke + "\n";
 +        s = s + "Leistung: " + leistung + "\n";
 +        s = s + "Radanzahl: " + radAnzahl + "\n";
 +        return s;
 +    }
 +}
 +</code>
 +
 +==== Die Klasse Auto (Unterklasse): ====
 +<code java>
 +public class Auto extends Fahrzeug
 +{
 +    private boolean hatKlimaanlage;
 +    
 +    public Auto(String marke, boolean hatKlimaanlage, double leistung){
 +        super(marke, 4, leistung);
 +        this.hatKlimaanlage = hatKlimaanlage;  
 +    }
 +    
 +    public String gibDaten(){
 +        String s = super.toString();
 +        s = s + "Klimaanlage: " + hatKlimaanlage;
 +        return s;
 +    }
 +}
 +
 +</code>
 +==== Die Klasse Motorrad (Unterklasse): ====
 +<code java>
 +public class Motorrad extends Fahrzeug
 +{
 + private boolean hatBeisitzer;
 +    
 +       public Motorrad(String marke, boolean hatBeisitzer, double leistung){
 +        super(marke, 2, leistung);
 +        
 +        this.hatBeisitzer = hatBeisitzer;  
 +    }
 +    
 +    public String gibDaten(){
 +        String s = super.toString();
 +        s = s + "Beisitzer: " + hatBeisitzer;
 +        return s;
 +    }
 +}
 +</code>
 +
 +===== 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,  Auto oder Motorrad zeigen. \\ 
 +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, wenn eine Methode der Basisklasse bei mehreren Unterklassen überschrieben wird. 
 +</WRAP>
 +
 +=== Beispiel: Liste von Fahrzeugen unterschiedlicher Klassen ===
 +<code java>
 +public class FahrzeugTest
 +{
 +    
 +    public void test(){
 +        
 +        Fahrzeug[] liste = new Fahrzeug[3];
 +        liste[0] = new Auto("BMW i3", true, 140.0);
 +        liste[1] = new Motorrad("Harley", false, 180.0);
 +        liste[2] = new Auto("Audi A3", true, 120.0);
 +        
 +        for(int i = 0; i < liste.length; i++){
 +            
 +            Fahrzeug f = liste[i];
 +            System.out.println(f.gibDaten()); // Hier passiert die Magie!
 +            System.out.println();
 +        
 +        }
 +        
 +        
 +    }
 +    
 +    
 +    
 +}
 +</code>
 +
 +Der Methodenaufruf ''f.gibDaten() '' ruft beim ersten und dritten Objekt die Methode ''gibDaten()'' der Klasse ''Auto'' auf, beim zweiten Objekt die Methode ''gibDaten()'' der Klasse ''Motorrad''.
 +
 +
 +===== 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.
 +</WRAP>
 +
 +=== 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:\n";
 +        s = s + "Marke: " + marke + "\n";
 +        s = s + "Leistung: " + leistung + "\n";
 +        s = s + "Radanzahl: " + radAnzahl + "\n";
 +        return s;
 +    }
 +    
 +    abstract public String gibDaten();
 +}
 +</code>
 +
 +==== Die Klasse Auto (Unterklasse): ====
 +<code java>
 +public class Auto extends Fahrzeug
 +{
 +    private boolean hatKlimaanlage;
 +    
 +    public Auto(String marke, boolean hatKlimaanlage, double leistung){
 +        super(marke, 4, leistung);
 +        this.hatKlimaanlage = hatKlimaanlage;  
 +    }
 +    
 +    abstract public String gibDaten(){
 +        String s = gibFahrzeugdaten();
 +        s = s + "Klimaanlage: " + hatKlimaanlage;
 +        return s;
 +    }
 +}
 +
 +</code>
 +==== Die Klasse Motorrad (Unterklasse): ====
 +<code java>
 +public class Motorrad extends Fahrzeug
 +{
 + private boolean hatBeisitzer;
 +    
 +       public Motorrad(String marke, boolean hatBeisitzer, double leistung){
 +        super(marke, 2, leistung);
 +        
 +        this.hatBeisitzer = hatBeisitzer;  
 +    }
 +    
 +    public String toString(){
 +        String s = gibFahrzeugdaten();
 +        s = s + "Beisitzer: " + hatBeisitzer;
 +        return s;
 +    }
 +}
 +</code>
 +
 +
 +===== Zugriffsmodifikatoren (Access Modifiers) =====
 +Die Schlüsselworte ''public'', ''protected'' und ''private'' regeln die Sichtbarkeit von Methoden:
 +  * ''public''-Methoden sind von jeder Klasse aus sichtbar.
 +  * ''protected''-Methoden sind nur in der Klasse selbst und in allen Unterklassen der Klasse sichtbar.
 +  * ''private''-Methoden sind nur in der Klasse selbst sichtbar.
Drucken/exportieren
QR-Code
QR-Code schule:klassen:2018:10bc:kap11 (erstellt für aktuelle Seite)