Ссылочный вопрос об устройстве хранения данных Java

В Java при передаче объекта методу в качестве параметра он на самом деле передает ссылку или указатель, к тому объекту, потому что объекты в Java являются ссылками.

В функции это имеет указатель на тот объект, который является местоположением в памяти. Я задаюсь вопросом, где этот указатель живет в памяти? Новая ячейка памяти создается однажды в функции для содержания этой ссылки?

6
задан aab 22 May 2010 в 16:42
поделиться

3 ответа

В функции ссылка на параметр хранится в стеке. Упомянутая вещь может жить где угодно.

Когда какой-либо код вызывает метод, обычно в стеке исполняемого потока выделяется пространство, и это пространство используется для хранения параметров, которые передаются функции. Если один из параметров «является объектом», то на самом деле используется ссылка на объект; эта ссылка копируется в стек, чтобы вызываемый код мог ее найти. Важно понимать, что копируется не сам объект, а только ссылка.

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

2
ответ дан 17 December 2019 в 20:29
поделиться

Объекты не являются ссылками, но вы используете ссылки везде. например

String a = "abc";

- это ссылка на строку . Так что ссылки распространяются повсюду. Это указатели? Нет. Ссылка больше похожа на дескриптор объекта. JVM может перемещать объекты в памяти. Указатель должен измениться, чтобы отразить это. Ссылка - нет. Ссылку можно смоделировать как указатель на указатель.

0
ответ дан 17 December 2019 в 20:29
поделиться

Каждый параметр функции передается значением - однако параметр не является объектом, а является ссылкой.

Итак, один и тот же объект существует с двумя ссылками на него.

String s = "my string"; // reference to this object created
doSomething(s); // in the doSomething function, a new reference to the same point of memory is passed by value

Это означает, что когда у меня есть функция void doSomething (String str) , я работаю так же, как и вне функции, за исключением того, что у меня есть другая ссылка. Ссылка на тот же объект, но другая ссылка. Итак, если внутри моей функции я использую str = "different string"; , который не изменит s - s, по-прежнему указывает на ту же точку памяти, что и все время, но теперь str ] вместо того, чтобы указывать на то, на что указывает s, теперь указывает, где хранится «другая строка».

0
ответ дан 17 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: