Aufruf Basisklasse überschrieben-Funktion aus der Basis-Klasse Methode
public class A {
public void f1(String str) {
System.out.println("A.f1(String)");
this.f1(1, str);
}
public void f1(int i, String str) {
System.out.println("A.f1(int, String)");
}
}
public class B extends A {
@Override
public void f1(String str) {
System.out.println("B.f1(String)");
super.f1(str);
}
@Override
public void f1(int i, String str) {
System.out.println("B.f1(int, String)");
super.f1(i, str);
}
}
public class Main {
public static void main(String[] args) {
B b = new B();
b.f1("Hello");
}
}
Ich bin auf der Suche nach diesen code-Ausgang:
B.f1(String)
A.f1(String)
A.f1(int, String)
Aber ich bin die erste:
B.f1(String)
A.f1(String)
B.f1(int, String)
A.f1(int, String)
Ich verstehe, dass im Kontext von B - "dieser" in A. f1(String) ist B Instanz.
Habe ich die Möglichkeit, die Kette new B1().f1(String) -> (A) f1(String) -> (A) f1(int, String) ?
Dies ist eine theoretische Frage, praktisch die Lösung wäre natürlich, die in Einer zur Umsetzung einer private-Funktion, die f1(String) und f1(int, String) nennen würde.
Danke,
Maxim.
Ich habe versucht, mit Reflexion (immer ein Method-Objekt für die f1(int, String) und die Berufung auf Sie), aber es hat nicht funktioniert. Dieses [blog-Eintrag][1] in Sun-blogs weist darauf hin, dass dies nicht möglich ist mit Java. [1]: blogs.sun.com/sundararajan/entry/...
Schön finden auf dem link
Schön finden auf dem link
InformationsquelleAutor Maxim Veksler | 2011-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider keine
So, ich bin sicher, Sie sind bewusst, aber ich werde ausdrücklich der Vollständigkeit halber - es gibt nur die 2 Stichworte zur Kontrolle der Methode invocation:
this.method()
- sucht-Methode ausgehend von der aufrufenden Instanz der Klasse (die Instanz "top" virtuelle Tabelle - implizierter Vorgabe)super.method()
- sucht-Methode ausgehend von der übergeordneten Klasse, von der Klasse, in der die aufrufende Methode definiert ist (die Berufung-class' - Eltern virtuelle Tabelle - nicht ganz wahr, ist aber einfacher zu denken, auf diese Weise - danke @maaartinus)Kann ich mir vorstellen, ein weiteres Schlüsselwort (z.B. aktuelle?) tun Sie, was Sie beschreiben:
current.method()
- sucht-Methode ausgehend von der Klasse, in der die aufrufende Methode definiert istaber Java gar nicht in einem solchen Schlagwort (noch?) nicht.
super.method()
nicht bei den Eltern VT. Es gibt keine VT-lookup an alle, es funktioniert ähnlich wie der Aufruf von privaten Methoden. AFAIK, es wird kompiliert mit invokespecial.vielen Dank - ach, ich Liebe es zu lernen, jeden Tag etwas neues. Also, es gibt keine
invokevirtualstartingfromparent
Unterricht -invokespecial
ist für diesuper
anrufen undinvokespecial
verwendet compile-time binding. So, in der Zeit dersuper
nennen, wir wissen genug über die Art zu tun, compile-Zeit-Auflösung der Ziel-Methode. Wenn Sie die Methode nicht umgesetzt in der direkten Oberklasse, dann nehme ich an das äquivalent einer Suche oben in der Hierarchie ist immer noch notwendig. Ist das Ergebnis genauso effektiv?Ich glaube nicht, dass es jeder lookup zur Laufzeit, auch nicht in diesem Fall. IIUIC,
super
bedeutet eigentlich Ahnherrn, dass es. Der compiler muss wissen, die ganze Hierarchie, so schreibt es die richtigen Vorfahren in der Klasse Datei. Bei der Methode gibt es nicht (was kann getan werden nur durch tricks mit anderen classfile), ein NoSuchMethodError geworfen erhält.vereinbart ist, wird die Methode immer gelöst zur compile-Zeit. Ich meinte, dass "das äquivalent einer Suche ... ist immer noch notwendig" zur compile-Zeit, so dass das Endergebnis ist das gleiche - die nächste Methode der Hierarchie nach oben gefunden und aufgerufen.
InformationsquelleAutor Bert F
Ich fürchte, es ist unmöglich, aber es gibt eine einfache Lösung:
this.
ist immer redundant.InformationsquelleAutor maaartinus
Überschriebenen Methoden in Java dynamisch gebunden. also der Typ der aktuellen Instanz des Objekts bestimmt, was aufgerufen wird.
final
Methoden (die können nicht überschrieben werden) undprivate
Methoden (die nicht vererbt werden) sind statisch gebunden.In C++, für den Kontrast müssten Sie explizit als Funktionen
virtual
zu bekommen, die das gleiche Verhalten.InformationsquelleAutor Brian Agnew
A
muss wissen, alle Ihre Subklassen (B
in diesem einfachen Fall), das ist schwierig, wenn Sie möchten, erstellen Sie eine neue Unterklasse weil man dann einstellen, KlasseA
auch.InformationsquelleAutor Sumit Jhajharia