Куча и стек, когда я использую переменную экземпляра в методе (память Java)

public class Main {
    private String sampleName= "Sample";
    public void show() {
        System.out.println(sampleName);
    }
}

Я знаю, что «образец» находится в разделе кучи, но где «sampleName» как ссылочная переменная? если он находится в куче, есть ли в стеке другая ссылка с именем «sampleName», которая ссылается на «sampleName» в куче?


person Hamid    schedule 25.12.2017    source источник
comment
Ссылочная переменная находится в куче как часть объекта Main.   -  person shmosel    schedule 25.12.2017
comment
@shmosel, когда вызывается метод println, как мы можем получить доступ из кадра стека к ссылке sampleName? Я думаю, что sampleName в качестве аргумента действует как локальная переменная и находится в стеке. Это правильно ?   -  person Hamid    schedule 25.12.2017
comment
Как только он передается в качестве аргумента, он помещается в стек.   -  person shmosel    schedule 25.12.2017


Ответы (2)


Я знаю «Образец», поскольку объект находится в разделе кучи

Правильный.

но где "sampleName" в качестве ссылочной переменной?

В объекте Main, который по определению находится в куче.

если он находится в куче, есть ли в стеке другая ссылка с именем «sampleName», которая ссылается на «sampleName» в куче

Да, как временный аргумент для println().

person user207421    schedule 25.12.2017

Ваш поток будет содержать только ссылку на вложенный объект Main. Он указывает на объект Main, выделенный в куче. Ссылка sampleName является полем объекта Main, следовательно, также в куче, указывающим на строку "Sample", которая поддерживается в пуле констант Java String (еще один раздел в куче). В стеке не может быть ссылки sampleName, так как это закрытое поле; в противном случае вы сможете получить к нему доступ в своем коде за пределами класса Main, что нарушает семантику языка Java. Если вы определили поле sampleName как public, а в своем коде вы сделали

Main main = new Main();
String copyOfSampleName = main.sampleName;

Тогда в вашем стеке будет ссылка String, которая вместе с исходной ссылкой sampleName указывает на объект String в пуле констант.

person justgivememyicecream    schedule 25.12.2017
comment
при вызове метода show новая переменная автоматически создается и помещается в стек, а затем ссылается на переменную экземпляра sampleName. Это значит? - person Hamid; 25.12.2017
comment
@ Хамид, так не бывает. Ну, на переменную sampleName неявно ссылается текущий поток через объект Main, верно? Таким образом, когда вызывается метод show, ссылка this для Main будет передана в кадр стека вызова метода, а System.out.println(sampleName); будет выполняться внутри области видимости объекта Main. Поскольку к закрытым полям можно получить доступ внутри класса, значение sampleName можно распечатать. - person justgivememyicecream; 25.12.2017
comment
Более подробное объяснение, вероятно, потребует более глубокого понимания механизмов вызова методов Java. Прочтите javaworld.com/article/2076949/learn-java/ или аналогичные материалы, если интересно. - person justgivememyicecream; 25.12.2017