Подтвердить что ты не робот

Ссылка 'this' хранится в стеке вызовов в Java?

Мы уже знали, что при вызове метода в Java параметры и локальные переменные будут сохранены в стеке.

Например, следующий код:

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);
    }
} 

Будет вызывать стек вызовов следующим образом, когда мы вызываем obj.test():

|             |
+-------------+
|     z       |
|     y       |  obj.test()
+-------------+
|    obj      |  main()
+-------------+

Но мне интересно, где хранится this ссылка в method? Он также хранится в стеке следующим образом:

|             |
+-------------+
|   this      |
|     z       |
|     y       |  obj.test()
+-------------+
|    obj      |  main()
+-------------+

Или он хранится в другой области в памяти? Или он вычисляется JVM во время выполнения?

Наконец, мне также интересно, имеет ли порядок параметров/переменной obj.test() в стеке определенный порядок, так же, как C имеет соглашение о вызове или зависит от реализации VM?

Обновление

Я знаю, что this - это ключевое слово вместо обычной ссылочной переменной, но моя главная забота об этом примере - как JVM знает, где объект лежит в куче?

Или, другими словами, как JVM может узнать, что является текущим объектом метода-члена во время выполнения, чтобы они могли получить доступ к этой переменной экземпляра?

4b9b3361

Ответ 1

Большинство языков, построенных вокруг модели stackmachine, будут работать точно так, как вы описали. Сюда входят Java,.NET и С++.

Подумайте об этом так: методы кода экземпляра, скорее всего, будут использоваться во всех экземплярах класса, было бы бессмысленно копировать что-либо большее, чем данные для каждого экземпляра, если эта общая часть (код для реализации methiod, помните, что все это просто память для компьютера) одинаково во всех случаях.

Итак, что отличает методы экземпляра от статических (в Java и .NET) методов - это неявный этот параметр, который добавляется к каждой сигнатуре метода. Неявные эти параметры означают экземпляр, над которым должен работать метод. А так как передача параметров методу, скорее всего, происходит по стеку, да, этот параметр будет сохранен в стеке. (см. http://zeroturnaround.com/articles/java-bytecode-fundamentals-using-objects-and-calling-methods/#objects для Java, это очень похоже на то же самое в .NET). Этот параметр передается первым параметром в стек перед вызовом метода, за которым следуют все остальные параметры.

Теперь это описывает модель виртуальной машины. Если машинный код JITed действительно передаст этот параметр по стеку или в регистре (или каким-либо другим способом), он будет полностью реализован и прозрачен для виртуальной машины.

Еще одна вещь, о которой стоит остерегаться в вашем примере кода, состоит в том, что вы дважды использовали имя переменной "y", поэтому в методе локальная переменная "y" будет затенять переменную экземпляра, за исключением случаев, когда вы явно квалифицируете ее с помощью 'this'.

Ответ 2

Ваш вопрос: -, как JVM может узнать, что является текущим объектом метода-члена во время выполнения, поэтому они могут получить доступ к этой переменной экземпляра..

What i know is , when u call a method with its object then implicitly
your object reference is passed to your method. like....

obj.test(obj,3);

And at run time this object is cached in this keyword..  that means this is local
for that method and must be get m/m in stack.