Was ist grob der Unterschied zwischen interfaces, abstrakten Klassen und Vererbung in Java?

2 Antworten

Interfaces:
Kann erben von anderen interfaces

Stimmt

Keine Methoden erklären

Ich weiß nicht genau, was du mit "erklären" meinst, aber man kann in Interfaces angeben, welche Methoden die implementierenden Klassen bereitstellen müssen. Z.B. so:

interface TestInterface {
    public String helloWorld();
}

Man kann nicht auf herkömmliche Weise definieren, was die jeweilige Methode tun soll, aber es gibt sogenannte "default" Methoden, mit denen man eben doch etwas vorgeben kann. Z.B.

interface TestInterface {
	public String helloWorld();
	
	public default String aybabtu() {
		return "All your base are belong to us!";
	}
}

Das wird in der Regel aber nur gemacht, wenn ein lange existierendes Interface um neue Methoden erweitert werden soll, aber man vermeiden will, dass alle Klassen, die das Interface implementieren, angepackt werden müssen, um die neuen Methoden zu unterstützen.

Override

Die Methoden, die in einem Interface vorgegeben werden, müssen von den implementierenden Klassen überschrieben werden, ja.

Wenn ein anderes Interface von dem Interface erbt oder eine abstrakte Klasse das Interface implementiert, müssen die Methoden da drin natürlich noch nicht überschrieben werden.

Keine Objekt Instanzen

Würde ich so nicht sagen. Was stimmt ist, dass du nicht einfach den Konstruktor eines Interfaces aufrufen kannst, aber du kannst trotzdem Objekte vom Typ des Konstruktors erstellen und du kannst die Methoden in einer anonymen Klasse definieren, was so aussieht, als wenn du das Interface einfach instanziieren würdest. Z.B. so:

TestInterface test = new TestInterface() {
	@Override
	public String helloWorld() {
		// TODO Auto-generated method stub
		return "Hello, World!";
	}
};
Abstrakte Klasse so ähnlich aber unterklasse nur nur eine abstrakte Klassen haben.

Einerseits das, andererseits ist die Syntax ein bisschen anders. In einer abstrakten Klasse musst du bei allen abstrakten Methoden das Keyword "abstract" dazuschreiben. In der Regel benutzt du abstrakte Klassen halt für alles, wo du erstmal nur einen groben Entwurf machst und die Details dann in den Unterklassen programmierst (z.B. eine abstrakte Klasse "Fahrzeug" und die Unterklassen "Auto", "LKW", "Fahrrad" etc.) und Interfaces benutzt du, wenn du vorgeben willst, welche Methode eine Klasse können muss, um irgendwelche Funktionen zu erfüllen (z.B. wenn du eine Klasse "Bruch" erstellst, und sagen willst, dass die Brüche mit anderen Brüchen verglichen werden können (z.B. um sie der Größe nach zu sortieren), kannst du das Interface "Comparable<Bruch>" implementieren und musst dann die Methode "public int compareTo(Bruch other)" bereitstellen.

Das TestInterface von oben würde als abstrakte Klasse so aussehen:

abstract class TestClass {
	public abstract String helloWorld();
	
	public String aybabtu() {
		return "All your base are belong to us!";
	}
}
Kann man methoden die abstrakt oder nicht abstrakt sind überschreiben?

Ja. Abstrakte Methoden muss man sogar überschreiben (außer in abstrakten Unterklassen) und nicht-abstrakte Methoden kann man überschreiben, solange sie nicht als "final" deklariert sind.

Der grosse unterschied ist das du von Mehreren Interfaces erben kannst. Aber nur von einer klasse.

Ein interface stellt nur Methoden Signaturen bereit. Mehr nicht.

Das Interface sagt quasi: Ich kann Methode Foo() und methode Bar().

Mehr nicht.

Abgeleitete Klassen müssen dann diese Methoden implementieren.

Eine abstakte klasse kann man natürlich auch von einer anderen klasse und von interfaces ableiten. Und hat alle funktionalitäten einer normalen klasse. Bis auf die das man sie nicht instanziieren kann. Sprich: man kann keine objekte aus ihr erzeugen.

Abstrakte klassen können auch wie interfaces methoden definieren die nicht implementiert sind. Eine von der klasse abgeleitete Klasse muss diese dann implementieren. Oder selbst auch abstract sein.

Methoden an sich kann man überschreiben unabhängig davon ob die Klase abstract ist oder nicht.