Vererbung - Objektorientierung

Vererbung ist ein grundlegendes Prinzip der objektorientierten Programmierung. Es können neue Klassen erstellt werden, die ausgehend von einer bestehenden Klasse Eigenschaften erben können. Die abgeleitete Klasse kann Variablen und Methoden der Ausgangsklasse bearbeiten oder neue hinzufügen.

Bei der Vererbung gibt es immer eine vererbende Klasse, die auch Oberklasse oder Superklasse heißt, und eine erbende Klasse, die auch Unterklasse oder abgeleitete klasse genannt wird. Es ist die Rede von einer "ist-ein" Beziehung. (z.B.: Pudel ist ein Hund), wobei "Pudel" die Unterklasse darstellt und Hund die Oberklasse.
Die Vererbung ermöglicht uns also Variablen und Methoden einer Klasse an eine andere weiter zu geben.

Die Unterklasse erbt Daten und Methoden von der Oberklasse. Sie kann jedoch weitere Daten und Methoden enthalten, die keinen Bezug zur Oberklasse haben. In der Programmiersprache Java findet eine Vererbung über das Schlüsselwort extends statt.

public class Artikel {
	// Oberklasse
}

public class Buch extends Artikel {
	// Unterklasse erbt Informationen von der Oberklasse
}

public class CD extends Artikel {
	// Unterklasse erbt Informationen von der Oberklasse
}

Beispiel - Verwaltung einer Bibliothek

Schauen wir uns ein komplexeres Beispiel an um uns das Prinzip der Vererbung näher zu bringen.
Stellen Sie sich vor sie erstellen ein Programm zur Verwaltung einer Bibliothek. Kunden können verschiedene Artikel wie Bücher, CDs oder Zeitschriftenausleihen.

Die Variablen name, artikelnummer und anzahl müssten in jeder Klasse separat deklariert werden. Somit wäre es sinnvoll Artikel als Oberklasse zu deklarieren, welche ihre Daten an die Unterklassen Buch, CD und Zeitschrift vererbt.

public class Artikel {
    private String name;
    private int artikelnummer;
    private int anzahl;
    
    public Artikel() {
        
    }
    public Artikel(String name, int anzahl) {
        this.name = name;
        this.anzahl = anzahl;
        this.artikelnummer = artikelnummer;
    }
    public void set_Name(String name) {
        this.name = name;
    }
    public void set_artikelnummer(int artikelnummer) {
        this.artikelnummer = artikelnummer;
    }
    public void set_anzahl(int anzahl) {
        this.anzahl = anzahl;
    }
    public String get_Name() {
        return this.name;
    }
    public int get_artikelnummer() {
        return this.artikelnummer;
    }
    public int get_anzahl() {
        return this.anzahl;
    }   
}

public class Buch extends Artikel {
    private String verlag;
    private String sprache;
    private String typ;             // Buchtyp (gebunden, ungebunden)
    private int isbn;

    public Buch() {
        
    }
    public Buch(String name, int anzahl, String verlag, String sprache, int isbn, String typ) {
        super(name, anzahl);
        this.verlag = verlag;
        this.sprache = sprache;
        this.isbn = isbn;
        this.typ = typ;
    }
    public void set_Verlag(String verlag) {
        this.verlag = verlag;
    }
    public void set_Sprache(String sprache) {
        this.sprache = sprache;
    }
    public void set_isbn(int isbn) {
        this.isbn = isbn;
    }
    public void set_typ(String typ) {
        this.typ = typ;
    }
    public String get_Verlag() {
        return this.verlag;
    }
    public String get_Sprache() {
        return this.sprache;
    }
    public int get_Isbn() {
        return this.isbn;
    }
    public String get_typ() {
        return this.typ;
    }
}

Möchte man nun ein neues Objekt vom Typ Buch anlegen kann das wie folgt realisiert werden:

private void buchAnlegen() {
    String name, verlag, sprache, typ;
    int isbn, anzahl, zaehler = 999;
    Scanner scannerVar = new Scanner(System.in);
    System.out.println("Name: ");
    name = scannerVar.next();
    System.out.println("Anzahl: ");
    anzahl = scannerVar.nextInt();
    System.out.println("Verlag: ");
    verlag = scannerVar.next();        
    System.out.println("Sprache: ");
    sprache = scannerVar.next(); 
    System.out.println("isbn: ");
    isbn = scannerVar.nextInt();
    System.out.println("Typ (gebunden/ungebunden): ");
    typ = scannerVar.next(); 
    
    Buch b1 = new Buch(name, anzahl, verlag, sprache, isbn, typ); 
}	

Verkettung von Konstruktor - Schlüsselwort super()

Vorweg: Konstruktoren werden nicht vererbt, get und set Methoden werden vererbt. Betrachten wir das Beispiel zur Verwaltung einer Bibliothek. Die Oberklasse Artikel besitzt einen Konstruktor
public Artikel(String name, int anzahl), mit den Attributen name und anzahl.
Die Unterklasse Buch wurde um die Attribute verlag, sprache, isbn und typ erweitert. Möchte man ein neues Objekt vom Typ Buch erstellen wird automatisch der Konstruktor der Klasse Buch aufgerufen. Dieser Konstruktor sollte auch die Attribute der Superklasse enthalten - also name und anzahl.

Die Superklasse kann also nur vererben, wenn ein entsprechendes Objekt der Superklasse erzeugt wurde. Wenn also der Konstruktor der Subklasse aufgerufen wird, kann dieser erst los legen wenn ein Objekt der Superklasse erzeugt wurde. Andernfalls kann nicht von der Superklasse geerbt werden.
Also: Bevor der Konstruktor der Subklasse aufgerufen wird, muss der Konstruktor der Superklasse aufgerufen werden.
Hierzu fügt man als erstes Statement den Aufruf des super-Konstruktors ein.

public Buch(String name, int anzahl, String verlag, String sprache, int isbn, String typ) {
    super(name, anzahl);
    this.verlag = verlag;
    this.sprache = sprache;
    this.isbn = isbn;
    this.typ = typ;
}

keyboard_arrow_left

Vorheriger Artikel

Klassen und Objekte

Grundlagen, Konstruktor, get-/set-Methoden, Beispiele

Nächster Artikel

Arrays

Grundlagen, Array-Liste, Iterator

keyboard_arrow_right

Werbung

Maconline
Maconline