Java ByteCode aload_0 Bedeutung bei Konstruktor definition

Hi,

ich hab folgendes Program:

{

	public Example()
	{
		int value= 12;

		String s= new String("asd");

		value= +10;
	}

}```

Dieses hat folgenden Bytecode: 


public class Example {

public ()V
L0
ALOAD 0
INVOKESPECIAL java/lang/Object. ()V
L1
BIPUSH 12
ISTORE 1
L2
NEW java/lang/String
DUP
LDC “asd”
INVOKESPECIAL java/lang/String. (Ljava/lang/String;)V
ASTORE 2
L3
BIPUSH 10
ISTORE 1
L4
LINENUMBER 13 L4
RETURN
}



Wieso steht am Methoden Anfang aload 0 bzw. aload_0. Im "Register" 0 ist doch zu dem Zeitpunkt gar nichts was er auf dem Stack laden könnte? Oder ist das nur ein hinweis das jetzt irgendwo eine Referenz auf dem Stuck gepusht wird?

Ich würd mal spontan denken das es was mit dem Call auf Object. zu tun hat … auch wenn mir da irgendwo eigentlich noch das für das Laden der Klasse fehlt.

Ich zitiere mal aus der JVMS (§invokespecial):

If the method is not native, the nargs argument values and objectref are popped from the operand stack. A new frame is created on the Java Virtual Machine stack for the method being invoked. The objectref and the argument values are consecutively made the values of local variables of the new frame, with objectref in local variable 0, arg1 in local variable 1 (or, if arg1 is of type long or double, in local variables 1 and 2), and so on.

Invokespecial legt die Konstruktorargumente also vom Stack in die lokalen Variablen. Die Objektreferenz des zu initialisierenden Objektes landet gem. Spezifikation in Variable 0.
Mit dem aload wird also die Objektreferenz wieder auf den Stack gelegt, weil das nachfolgende invokespecial auf Object die Referenz auf das zu initialisierende Objekt auf dem Stack erwartet (steht ebenfalls im oben verlinkten Paragraphen).

P. S.: dass die -Methode nur durch invokespecial aufgerufen werden kann, steht übrigens hier: §2.9. Special Methods (nur um die Argumentation abzuschließen :wink: )

Aha Danke! Hat mir sehr geholfen das Prinzip zu verstehen.