Sagen wir, ich habe eine Klasse Fraction
:
Und das ist der Bytecode der obigen Methode:
%Vor%Ich versuche zu verstehen, warum der Unterricht an Position 3 überhaupt dorthin gebracht wurde. Ich würde sagen, wir müssten nur Folgendes tun, damit es funktioniert:
%Vor%Warum ist das nicht so?
Wenn der Bytecode für den Konstruktor gestartet wird, gibt es kein Fraction-Objekt. Der Befehl new
weist dem Heap ein Objekt Fraction
(nicht initialisiert) zu und hinterlässt auf dem Stapel einen Verweis darauf. Die Anweisung dup
ist so, dass eine Referenz verwendet werden kann, um <init>
und die zweite für areturn
am Ende aufzurufen.
Ihr Bytecode ist falsch. Lassen Sie uns durchgehen:
%Vor% Stack : Fraction
instance (nicht initialisiert, nur ein Zeiger auf den Speicher)
Stapel : Fraction
(noch nicht initialisiert), this
Stapel : Fraction
(noch nicht initialisiert), this.den
Stack : Fraction
(noch nicht initialisiert), this.den
, this.num
Stapel :
Das ist entscheidend. Bei allen invoke
-Methoden muss der Stapel this
+ alle Argumente enthalten. Sowohl this
als auch Argumente werden vom Stapel genommen. Nach dem Aufruf wird nur ein Rückgabewert (falls vorhanden) auf den Stack gelegt. <init>
hat einen void
Rückgabetyp.
Das heißt, Sie rufen:
%Vor%Auf einem leeren Stapel blenden Sie die JVM aus.