Java abstrakte Klasse eine Schnittstelle implementiert, beide haben die gleiche Methode
Während der Blick auf einige OOP-Materialien, dachte ich, von dieser Frage verwirrt mich ein wenig:
Sollten Sie mit dem folgenden interface,abstrakte Klasse und konkrete Klasse:
package one;
public interface A {
void doStuff();
}
package one;
public abstract class B implements A {
public abstract void doStuff();
}
class C extends B{
public void doStuff() {
}
}
Klasse C nicht kompilieren, es sei denn, es stellt eine Implementierung für die Methode doStuff()
.
Die Frage ist hier:
1-Ist doStuff()
Methode in der Klasse C eine Implementierung der Schnittstelle Eine's Methode, oder ist es für die abstrakte Methode in der Klasse B ? um genauer zu sein: Wie wird die JVM
Behandlung der Funktion, da eine Funktion aufgerufen, der das interface oder die abstrakte Klasse ?
2-Ist die abstrakte Methode doStuff()
in der abstrakten Klasse B als eine "Umsetzung" für die doStuff()
Methode im interface Eine? so macht es verpflichtend für Klasse C zu implementieren Sie die abstrakte Klasse version von doStuff()
statt dem interface ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In einer Schnittstelle sind alle Methoden
public
undabstract
.Weiß, Schnittstelle A doStuff ist eigentlich
public abstract void doStuff()
. Das sollte vertraut Aussehen, als Abstrakte Klasse B hat die gleiche Signatur der Methode.Antwort zu Frage 1, Klasse B
doStuff()
ist die gleichen als Schnittstelle Eine sdoStuff()
. Da alle Methoden in Java sind virtuelle, ruftdoStuff()
werden die gleichen sein, unabhängig davon, ob Sie Ihre C erklärt wird, wie Ein a, ein B, oder C.Als für Frage 2, Nein. B
doStuff()
ist redundanter code, der nicht wirklich etwas tun. C ist die Umsetzung Eines derdoStuff()
ob oder nicht B erklärtdoStuff()
.Für Frage #1: Die Methode doStuff in der C-Klasse ist die Implementierung der Methode doStuff Erklärung zu B und C. da die Methode doStuff Erklärung in der abstrakten Klasse B und Eine Schnittstelle hat die gleiche Signatur wie jede andere. Eigentlich, wenn B C implementiert, gibt es keine Notwendigkeit zu erklären, doStuff Methode wieder.
Zur Frage #2: Nein, die doStuff in B ist nur eine Erklärung, nicht eine Methode der Umsetzung. wenn B keine Methode Implementierung oder zusätzliche Methode der Erklärung, es ist unnötig von der Klasse B. Grundsätzlich die abstrakte Klasse ist eine Art Vorlage mit high-level-Logik für die Bequemlichkeit Ihrer Unterklassen.
Für die Instanz der Klasse B, C. doStuff() überschreibt B. doStuff() und implementiert A. doStuff(). Alle Methoden in java aufgerufen werden, praktisch. In der Tat gibt es keinen Unterschied für Benutzer, ob C. doStuff() überschreibt B Methode oder Ein ist. Für jvm-es wird anders werden, weil die Schnittstelle basiert Aufruf unterscheidet sich von Klasse basiert.
UPD: Dies hängt von der Art der link, den Sie aufrufen aus. verschiedene opcoded wird erzeugt von javac: invokevirtual oder invokeinterface
Wenn Sie entfernen die
In Ihrem abstrakten Klasse, dann das Kind, das erbt diese Klasse muss diese Methode implementieren.
Versuchen, Sie zu entfernen, diese Methode in der Klasse B und die Ergebnisse in der Klasse C
Siehe Abschnitt, Wenn eine Abstrakte Klasse eine Schnittstelle Implementiert, die in http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html
Ich denke, dass die Erklärung, die Sie suchen finden hier.
Frage 1: Methode in der Klasse C implementiert. Da es nur B erstreckt sich jedoch nur umsetzen muss B abstrakte Methoden und implementierte Schnittstellen.
Frage 2: Es ist nicht als eine Umsetzung. Abstrakte Klassen nicht haben, um alle Schnittstellen-Methoden. Umsetzung in der Klasse C ist zwingend erforderlich (auch wenn Sie nicht über das abstrakte eins in Klasse B).