Vererbung Abstrakte Methoden: Wozu das Ganze?!

SystemExit

Mitglied
Abstrakte Methoden wie die hier:
[CODE lang="java" title="Tier Klasse"]public abstract class Tier {
public abstract void laufen();
}[/CODE]

[CODE lang="java" title="Katze"]public class Katze extends Tier{

@Override
void laufen(){
System.out.println("Katzen können laufen!");
}
}[/CODE]

Soweit so gut...
Aber wozu brauche ich die abstrakte Methode in der Tier Klasse? Ist die Zeile nicht unnötig?
// Wie müsste die Methode denn aussehen, damit es auch wirklich Sinn e gibt eine solche abstrakte Methode einzuführen?
 
Beste Antwort
K
Ja genau, damit ist dann sicher, dass alle Instanzen von einer Klasse, die von Tier erbt, diese Methode implementieren.

Wenn Du also eine Variable vom Typ Tier hast, dann kannst Du da laufen() drauf aufrufen.
K

kneitzel

Gast
Ja genau, damit ist dann sicher, dass alle Instanzen von einer Klasse, die von Tier erbt, diese Methode implementieren.

Wenn Du also eine Variable vom Typ Tier hast, dann kannst Du da laufen() drauf aufrufen.
 
Beste Antwort

Robert Zenz

Top Contributor
Bei derart abstrakten Beispielen ist es immer schwierig direkt den Nutzen zu sehen. Abstrakte Klassen mit abstrakten Methoden werden dann verwendet wenn du Logik hast welche zwischen allen implementierenden Klassen ident sein soll. Nehmen wir dein Beispiel aber bauen es etwas um:

Java:
public abstract class Tier {
    public abstract void lautGeben();
}

Mit der konkreten Implementierung einer Katze und eines Hundes:

Java:
public class Katze extends Tier {
    @Override
    public void lautGeben() {
        System.out.println("Miau");
    }
}

public class Hund extends Tier {
    @Override
    public void lautGeben() {
        System.out.println("Wuff");
    }
}

Wenn du jetzt eine Instanz von der Klasse "Tier" hast, kannst du immer "lautGeben" aufrufen ohne das du wissen musst welche konkrete Implementierung es tatsaechlich ist:

Java:
// instanceProvider ist eine Instanz einer Factory, also eine Klasse welche
// die Instanz von "Tier" erzeugt ohne dass du weiszt welche konkrete
// Implementierung es ist.
Tier tier = instanceProvider.getTier();

tier.lautGeben();

In diesem Fall macht es natuerlich weniger Sinn eine abstrakte Klasse zu haben, sondern stattdessen eine Schnittstelle:

Java:
public interface Tier {
    public abstract void lautGeben();
}

public class Katze implements Tier {
    @Override
    public void lautGeben() {
        System.out.println("Miau");
    }
}

public class Hund implements Tier {
    @Override
    public void lautGeben() {
        System.out.println("Wuff");
    }
}

Funktioniert hier genau gleich.

Interessant wird es dann wenn du Logik teilen willst, welche zwischen allen Implementierungen gleich sein wird. Da kannst du ebenfalls abstrakte Klassen verwenden wenn du das implementieren von Schnittstellen vereinfachen willst. Nehmen wir wieder unser Tier und nehmen an dass die Ausgabe von dem Laut nicht einfach nur "System.out.println" ist, sondern zum Beispiel eine Berechnung braucht und komplizierter ist. Jetzt will man nicht alle Implementierungen dazu zwingen den komplexen Code jedes mal neu zu erfinden, also gibt es zwei Moeglichkeiten:

Man packt den komplexen Code als "protected" Methode dazu:

Java:
public abstract class Tier {
    public abstract void lautGeben();
  
    protected void lautMachen(String laut) {
        // Stell dir hier komplexe Logik vor.
    }
}

public class Katze extends Tier {
    @Override
    public void lautGeben() {
        lautMachen("Miau");
    }
}

public class Hund extends Tier {
    @Override
    public void lautGeben() {
        lautMachen("Wuff");
    }
}

Oder, insbesondere wenn man eine Schnittstelle dazu hat, verlagert man die zu implementierende Logik in abstrakte Methoden:

Java:
public interface Tier {
    public abstract void lautGeben();
}

public abstract class AbstractTier implements Tier {
    @Override
    public void lautGeben() {
        String laut = getLaut();
        // Stell dir hier komplexe Logik vor mit "laut".
    }
  
    protected abstract String getLaut();
}

public class Katze extends Tier {
    @Override
    protected void getLaut() {
        return "Miau";
    }
}

public class Hund extends Tier {
    @Override
    protected void getLaut() {
        return "Wuff";
    }
}

Die Verwendung von den Klassen hat sich nicht veraendert:

Java:
Tier tier = someInstanceProvider.getTier();

tier.lautGeben();

Aber der Unterschied ist hier wo man die Logik findet. Diese Schnittstelle + Abstrakte Klasse Kombination findet man oft wenn die konkreten Klassen viel Logik untereinander teilen. Dann packt man das was geteilt wird in die abstrakte Klasse und die konkrete Implementierung muss nur noch die Feinheiten anpassen. Ein relativ schoenes Beispiel ist auch eine Klasse welche einen Wert schreibt (wohin ist dem Verwender quasi egal), etwas konvolut in diesem Fall, aber bleib' mal bei mir. Folgender Aufbau:

Java:
public interface Writer {
    public abstract void write(String value);
}

public abstract class AbstractStreamWriter implements {
    @Override
    public void write(String value) {
        try (OutputStream stream = getStream()) {
            stream.write(value);
        }
    }
  
    protected abstract OutputStream getStream();
}

public class FileWriter extends AbstractStreamWriter {
    @Override
    protected OutputStream getStream() {
        return new FileStream("Pfad zur Datei");
    }
}

// Verwendung
Writer writer = instanceProvider.getWriter();
writer.write("Wert");

Wenn du jetzt zum Beispiel eine Klasse brauchst welche in einen Netzwerk-Stream schreibt, musst du nicht das schreiben und die Stream-Verwaltung neu implementieren, sondern kannst dich von "AbstractStreamWriter" ableiten und musst nur noch den Stream erstellen.
 

X5-599

Top Contributor
Zwei kleine Anmerkungen:

Methoden die man in einem Interface definiert sind immer "public abstract". Man kann sie also auch nur mit Rückgabetyp, Namen und Parameterliste definieren.

Code:
public interface MyInterface {
  void myMethod(String something, String somethingOther);
  String go();
}

Kann natürlich jeder handhaben wie er will.

Das andere ist ein kleiner Fehler im vorletzten Beispiel. Du schreibst: public class Katze extends Tier. Das sollte AbstractTier heißen. Darunter für class Hund nochmal dasselbe.

Und im letzten Beipiel fehlt bei public abstract class AbstractStreamWriter implements das "Writer".
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S abstrakte methoden in subclass? Java Basics - Anfänger-Themen 7
G Java Abstrakte Methoden Java Basics - Anfänger-Themen 2
S Gehaltsberechnung (Vererbung, abstrakte Methoden) Java Basics - Anfänger-Themen 6
D Methoden Abstrakte Methoden Java Basics - Anfänger-Themen 3
C Abstrakte und virtuelle Methoden in Java Java Basics - Anfänger-Themen 4
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
D Methoden abstrakte Methoden und Rückgabewerte Java Basics - Anfänger-Themen 2
T OOP abstrakte klassen - methoden Java Basics - Anfänger-Themen 8
J Welchen Sinn haben abstrakte Methoden? Java Basics - Anfänger-Themen 4
StupidAttack Abstrakte Methoden in nicht-abstrakter Methode in abstrakter Klasse Java Basics - Anfänger-Themen 6
T OO, Konstruktor, abstrakte Methoden Java Basics - Anfänger-Themen 13
G Abstrakte Klassen und Methoden Java Basics - Anfänger-Themen 3
J Methodenaufrufe abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 17
M Abstrakte Klassen - Notation Java Basics - Anfänger-Themen 9
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
G Abstrakte Klassen Java Basics - Anfänger-Themen 11
T Abstrakte Klasse und Interfaces Java Basics - Anfänger-Themen 12
D Abstrakte Klasse, Konstruktorkette, Attribute setzen Java Basics - Anfänger-Themen 12
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
S Abstrakte Methode nutzen Java Basics - Anfänger-Themen 9
J abstrakte Methode in Klasse mit Rückgabetyp der abgeleiteten Klasse Java Basics - Anfänger-Themen 5
J Objekte und Abstrakte Klassen Java Basics - Anfänger-Themen 2
I Abstrakte Klasse - static Attribute deklarieren Java Basics - Anfänger-Themen 14
T Übungsaufgabe abstrakte Klasse Java Basics - Anfänger-Themen 21
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
S Datentypen Abstrakte Datentypen Java Basics - Anfänger-Themen 0
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
K Abstrakte Klasse: vererbte Klasse; instance of? Java Basics - Anfänger-Themen 26
A Abstrakte Datentypen - Methode delete Java Basics - Anfänger-Themen 6
N Vererbung Abstrakte Klasse stateful Java Basics - Anfänger-Themen 3
D Abstrakte Klassen Verständniss Frage Java Basics - Anfänger-Themen 4
W Abstrakte Klasse mit Variable? Java Basics - Anfänger-Themen 2
D Interface Interfaces und abstrakte Klassen implementieren Java Basics - Anfänger-Themen 4
B Abstrakte Klassen Java Basics - Anfänger-Themen 7
E verdeckte abstrakte Methode sinnvoll? Java Basics - Anfänger-Themen 7
A Vererbung Abstrakte Klasse mit Methode die Objekte der Subklassen benutzt? Java Basics - Anfänger-Themen 7
W Abstrakte und konkrete Klasse Java Basics - Anfänger-Themen 4
S Abstrakte Klassen Java Basics - Anfänger-Themen 2
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
F Abstrakte Klasse doch zum "Teil" instanzieren? Java Basics - Anfänger-Themen 4
V Interface Interfaces und abstrakte Klassen Java Basics - Anfänger-Themen 3
H Abstrakte Basisklasse Verständnisproblem! Java Basics - Anfänger-Themen 8
G Abstrakte Klassen - theoretische Frage Java Basics - Anfänger-Themen 2
OnDemand Abstrakte Klassen Java Basics - Anfänger-Themen 4
T OOP Abstrakte Klassen und ihre Kinder: wie läuft das? Java Basics - Anfänger-Themen 3
M Abstrakte Klassen Java Basics - Anfänger-Themen 2
J Interfaces Abstrakte Klassen Java Basics - Anfänger-Themen 15
M Interface und Abstrakte Klassen Java Basics - Anfänger-Themen 12
N Datentypen abstrakte Klasse wird instanziert Java Basics - Anfänger-Themen 3
B Abstrakte Methode vs. Interface Java Basics - Anfänger-Themen 2
propra Interface - abstrakte Klasse Java Basics - Anfänger-Themen 18
N Abstrakte Klasse Java Basics - Anfänger-Themen 28
R Namenskonvention abstrakte Klassen Java Basics - Anfänger-Themen 6
C OOP Objektstruktur: abstrakte Klassen Java Basics - Anfänger-Themen 3
L Über abstrakte Klasse auf eine Klasse zugreifen? Java Basics - Anfänger-Themen 6
V Vererbung Abstrakte Methode Java Basics - Anfänger-Themen 3
M Abstrakte Klassen Java Basics - Anfänger-Themen 21
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
D Abstrakte Klassen und Interfaces als Paramter in Funktionen Java Basics - Anfänger-Themen 3
T Abstrakte Klasse Java Basics - Anfänger-Themen 3
S Abstrakte Klasse Java Basics - Anfänger-Themen 5
T Interfaces: Braucht man abstrakte Klassen eigentlich noch? Java Basics - Anfänger-Themen 3
K Abstrakte Klasse vs. Interface Java Basics - Anfänger-Themen 21
T Abstrakte Klassen Java Basics - Anfänger-Themen 6
C abstrakte Klassen mögen mich nicht... Java Basics - Anfänger-Themen 2
I Abstrakte Klassen Java Basics - Anfänger-Themen 8
K Abstrakte Klasse bilden? Java Basics - Anfänger-Themen 11
S Abstrakte Klasse, festlegen, dass Methode verändert werden muss. Java Basics - Anfänger-Themen 4
D Zusammenfassung von Klassen (Vererbung? Abstrakte Klass? ...?) Java Basics - Anfänger-Themen 8
H Warum Java? | Abstrakte Klasse = Modul? Java Basics - Anfänger-Themen 20
C Schnittstellen und Abstrakte Klassen Java Basics - Anfänger-Themen 3
I Abstrakte Klassen Java Basics - Anfänger-Themen 22
J abstrakte klasse und methode super Java Basics - Anfänger-Themen 2
H Eine Abstrakte Klasse muss. Java Basics - Anfänger-Themen 7
G Abstrakte Klasse "Point" Java Basics - Anfänger-Themen 2
G Abstrakte Klassen ? Java Basics - Anfänger-Themen 9
G Abstrakte Methode in gleicher Klasse aufrufen Java Basics - Anfänger-Themen 5
M abstrakte Klasse Java Basics - Anfänger-Themen 3
nadoria abstrakte Klassen Java Basics - Anfänger-Themen 6
F Abstrakte Klasse: Konstruktor vs init() Java Basics - Anfänger-Themen 13
M Unterscheid Abstrakte Klassen/Interface Klassen? Java Basics - Anfänger-Themen 7
G Abstrakte Klasse (was passiert hier) Java Basics - Anfänger-Themen 3
T abstrakte Klassen? Java Basics - Anfänger-Themen 2
G Interface oder Abstrakte Klasse? Java Basics - Anfänger-Themen 3
G konkretes beispiel: interface hier besser als abstrakte kl. Java Basics - Anfänger-Themen 4
Acha Unterschied Interface - abstrakte Klasse Java Basics - Anfänger-Themen 4
M abstrakte klassen und interfaces Java Basics - Anfänger-Themen 2
B OOP: abstrakte klasse implementiert interface Java Basics - Anfänger-Themen 3
L abstrakte Methode nicht implementiert! Java Basics - Anfänger-Themen 5
M abstrakte klassen / Schnittstellen Java Basics - Anfänger-Themen 4
H abstrakte Klassen, Interfaces Java Basics - Anfänger-Themen 13
D Abstrakte Klasse Graphics Java Basics - Anfänger-Themen 3
R Interfaces durch abstrakte Klassen ersetzbar? Java Basics - Anfänger-Themen 8
A Abstrakte Klasse Java Basics - Anfänger-Themen 3
G abstrakte klasse Java Basics - Anfänger-Themen 6
F Abstrakte Klasse Baum Java Basics - Anfänger-Themen 6
A Eine abstrakte Methode static machen? Java Basics - Anfänger-Themen 4
A Abstrakte Klassen und Interfaces Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben