Warum invokeSpecial wird benötigt, wenn invokeVirtual vorhanden ist
Gibt es drei Befehle zum aufrufen von Java-Methoden. Es ist klar, dass invokeStatic ist nur für statische Methode invocation.
Soweit ich weiß invokespecial wird verwendet beim Aufruf von Konstruktor und private Methoden. Also, müssen wir differenticate privaten und öffentlichen method invocation zur Laufzeit? Es könnte geltend gemacht werden, mit den gleichen opcode sagen invokevirtual?
Tut JVM-deals mit private-und public-Methode-definition? Soweit ich weiß, öffentlichen und privaten Schlüsselwörtern ist nur erforderlich, an der Entwicklung der Verkapselung?
- Als pro Sie kommentieren, könnte es ein Szenario, in dem invokespecial ist erforderlich beim Aufruf der private-Methode.
- möglich, Duplikat der Method invocation von invokespecial und invokeinterface
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom diese Website
http://www.artima.com/underthehood/invocationP.html
Den link oben gibt wertvolle Beispiele deutlich, welche addresing meine Frage.
Beim aufrufen von main() in der Unterklasse, wie oben definiert, es muss print "Oberklasse interessante Methode." Wenn invokevirtual verwendet wurden, die es drucken würde "Unterklasse interessante Methode." Warum? Da die virtuelle Maschine wählen würde interestingMethod() aufrufen, um auf der Grundlage der tatsächlichen Klasse des Objekts, die Unterklasse. So wird es mit Unterklasse ist interestingMethod(). Auf der anderen Seite, mit invokespecial wird die virtuelle Maschine die Methode auszuwählen, die basierend auf dem Typ der Referenz, so Superclass-version der interestingMethod() aufgerufen wird.
interestingMethod
Signaturen ist genug, um zu verwirren den Leser, was passiert.Vielen Dank für das Lesen hin, dass die Erklärung: Bitte vergessen Sie nicht, upvote, wenn es hilft Ihnen, zu ermitteln, mit Montageanleitung Schöpfung bei Aufruf der Methode
Hier bin ich zu erklären, statische vs dynamische Bindung.
Zunächst werde ich Ihnen sagen, dass invokeStatic, invokeSpecial, invokeVirtual, invokeInterface etc sind die Montageanleitung, die generiert der compiler nach der Kompilierung.
Wie wir alle weiß, wir haben eine .Klasse-Datei-format nach der Kompilierung und wir können es nicht Lesen aus. Aber java bieten ein tool namens "javap".
Können wir Lesen unsere .Klasse Datei assembly-Anweisungen durch die Verwendung von javap-Befehl. Standardmäßig können wir nicht sehen private Methode Montageanleitung, so brauchen wir -privat, mit es. Unten sind die Befehle, um zu sehen, java-compiler generierte assembly-Anweisungen:
Imaging haben Sie A.java Klasse
Klasse A
{
public void printValue()
{
System.aus.println("Inside");
}
public static void callMethod(A)
{
ein.printValue();
}
}
öffnen cmd-Eingabeaufforderung und gehen Sie zu dem Ordner, die enthält, dass die java-Datei A.java.
ausführen javac A.java.
Nun A.class -Datei generiert, die enthält eine Montageanleitung, aber Sie können es nicht Lesen.
Laufen nun javap -c A
Können Sie sehen, die Montage-generation für Ihre Methode nennen --> ein.printValue();
Wenn printValue ( ) - Methode ist privat müssen Sie mit javap -c -private Ein .
Können Sie machen Sie Ihre printValue( ) private /static /public /private static beide.
Eine weitere Sache im Auge zu behalten, dass der erste compiler überprüfen Sie das Objekt auf dem die Methode wird immer aufgerufen. Dann finden seine Klasse Typ und festgestellt, dass die Methode in dieser Klasse, falls verfügbar, oder nicht.
Hinweis : Jetzt halten Sie im Verstand, wenn Sie unseren Aufruf an die Methode statisch ist, dann invokeStatic assembly generiert wird, wenn seine private dann invokeSpecial assembly-Anweisung generiert wird, und wenn sich die öffentliche dann invokeVirtual-Instruktion erzeugt wird. öffentliche Methode nie bedeuten, dass jedes mal, invokeVirtual-Instruktion erzeugt wird. Im Falle von super.printValue () - Aufruf aus der Unterklasse von A ist Ausnahmefall. d.h. wenn Ein parent-Klasse für B-und B-enthält die gleiche Methode printValue() dann generiert es invokeVirtual(dynamische) aber wenn printValue() in B haben super.printValue() als erste Anweisung dann invokeStatic wird generiert, auch wenn printValue() Eines öffentlich ist.
Lassen Sie uns versuchen dies zu:
--> speichern Sie diese durch Test.java
--> ausführen javac Test.java
--> javap -c -private Test