home  |  suche  |  kontakt/johner  |  institut 
studierende  |  tech-docs  |  mindmailer 

Vererbung

Die Vererbung drückt eine "is-a"-Beziehung aus. Das heisst, wenn die Klasse B von der Klasse A erbt, ist "B ein A", die Klasse B besitzt also alle Eigenschaften von A und darf auch zusätzliche eigene Eigenschaften haben.
B ist demnach eine Spezialisierung von A und die Klasse A eine Generalisierung von B.

Wenn eine Klasse von einer anderen Klasse abgeleitet wird, werden alle Eigenschaften (Attribute und Methoden ) von der Basisklasse geerbt und es können beliebig viele hinzugefügt werden. Die Vererbung erfolgt mit dem Schlüsselwort "extends".

Die abgeleitete Klasse kann dabei die Methoden oder Attribute, die in der Superklasse definiert und implementiert sind, überschreiben. Überschriebenes wird mit der Annotation @Override versehen, welche eine Methode kennzeichnet. Falls Sie nicht überschrieben wurde (Bsp. zu überschreibende Methode falsch geschrieben)  kommt es zur Fehlermeldung, weil die Methode in der Superklasse nicht vorhanden ist. Wenn Methoden oder der Konstruktor der Oberklasse explizit aufgerufen werden sollen kann das über "super.<Methodenname>" oder super.() gemacht werden.

Konstruktoren werden nicht vererbt. Bei der Ausführung eines Konstruktors (ein Objekt soll instanziert werden) wird der ausgewählte Konstruktor der Superklasse ausgeführt. Gibt es den nicht, weil in den Superklassen andere Konstruktoren definiert  sind (mit z. Bsp. Übergabeparamter), wird vom Compiler eine entsprechende Fehlermeldung angezeigt.

package vererbung;

public class Person {
  private String name;
  int matrikelnummer = 123456;

  public Person(String name) {
    super();
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
  //Methode darf nicht von abgeleiteten Klassen verändert werden, weil sie final ist
  public final void print() {
    System.out.println("Diese Ausgabe steht fest. "
        "Keine abgeleitete Klasse kann das verändern!");
  }

}
package vererbung;

//Die Klasse Studentin erbt von der Klasse Person
public class Studentin extends Person {

  public Studentin() {
    super("Gerdi");
  }
  //Die Methode der Oberklasse wird überschrieben
  public String getName() {
    return "Laura";
  }
  //Eine zusätzliche Methode, die die Oberklasse Person nicht kennt
  public void sayHello() {
    System.out.println("Hello");
  }

}

Wenn mit Vererbung gearbeitet wird, gelangt man schnell zum Thema Casting. Beim Casting geht es darum Klassen-Typen in andere Typen umzuwandeln.

Typumwandlungen zwischen Klassen-Typen sind in JAVA insoweit möglich, dass nicht die Objekte selbst verändert werden, sondern nur der Typ der entsprechenden Referenzen, d.h. lediglich die Zugriffsart auf die Objekte wird geändert. Es entstehen auch nie neue Objekte. Es ist nicht möglich, nach belieben Klassen in andere Typen umzuwandeln. Wichtig dabei ist immer zu wissen, von welchem Typ die Klasse ursprünglich war (also bei der Instanzierung). Um welche Klasse es sich handelt, lässt sich mit "instanceof" herausfinden.

Darf die Methode einer Super-Klasse nicht überschrieben werden, so muss sie in der Super-Klasse als final deklariert werden

Falls Methoden einer Super-Klasse überschrieben werden müssen, so muss diese zu überschreibende Methode als abstract deklariert werden.
(Bsp. abstract void UeberschreibeMich(); ...)

 

  class ... }
  class extends ... }
  class ... }
  
  /*Upcast Y -> X (in allgemeinere Richtung), es stehen
  nur die Methoden der Superklasse zur Verfügung
  wenn die Subklasse Y aber Methoden überschrieben hat, erinnert sich
  der Compiler und ruft die Methode der Subklasse auf*/
  X x=new Y();   
  Y y=(Y)x;        // nur möglich, da x eigentlich ein Y-Objekt ist
    
  X x2=new X();
  //Führt zur ClassCastException, x2 ist wirklich nur ein X-Objekt
  Y y2=(Y)x2;      
  Z z=(Z)x;        // Compilerfehler, X und Z sind nicht direkt verwandt


Darf die Methode einer Super-Klasse nicht überschrieben werden, so muss sie in der Super-Klasse als final deklariert werden.

 

Nützlicher Link:

http://www.scalingbits.com/java/javakurs1/vererbung/java