Sapevamo già che quando chiamiamo un metodo in Java, i parametri e le variabili locali verranno memorizzati nello stack.E 'presente questo riferimento memorizzato nello stack di chiamate in Java?
Ad esempio, il seguente codice:
public class Test
{
int x = 10;
int y = 20;
void test(int y)
{
int z = y;
this.x = y; // How JVM knows where is our current object?
}
public static void main(String [] args)
{
Test obj = new Test();
obj.test(3);
}
}
produrrà uno stack di chiamate simile al seguente quando abbiamo chiamato obj.test()
:
| |
+-------------+
| z |
| y | obj.test()
+-------------+
| obj | main()
+-------------+
Ma mi chiedo da dove viene this
riferimento nel method
memorizzata ? È anche memorizzato nello stack come il seguente:
| |
+-------------+
| this |
| z |
| y | obj.test()
+-------------+
| obj | main()
+-------------+
Oppure è memorizzato su un'altra area in memoria? Oppure è calcolato dalla JVM in fase di runtime?
Infine, sono anche curioso di sapere se l'ordine dei parametri/variabile di obj.test()
nello stack ha un ordine specifico, proprio come C ha convenzione di chiamata, o dipende dall'implementazione di VM?
Aggiornamento:
So this
è una parola chiave al posto di una variabile di riferimento normale, ma la mia principale preoccupazione per questo esempio, è come JVM sa da dove viene oggetto posato nel mucchio?
O in altre parole, in che modo JVM può sapere quale sia l'oggetto corrente di un metodo membro in fase di runtime, in modo che possa accedere a tali variabili di istanza?
se ricordo correttamente, 'this' è (implicitamente) passato come primo parametro a un metodo – weidi
È importante notare che quanto avviene in codice nativo e lo stack filo CPU e quanto descritto in bytecode per un virtuale la macchina può essere completamente diversa. per esempio. se il metodo 'test()' è in linea, non c'è nessuna chiamata al metodo, nessun valore 'this' o argomenti aggiunti allo stack. –