Вопрос хранения ссылок на Java - PullRequest
6 голосов
/ 22 мая 2010

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

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

Ответы [ 4 ]

2 голосов
/ 22 мая 2010

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

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

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

0 голосов
/ 04 октября 2012

например, в JFrame вы можете начать так:

public myFrame mF;

public void Panel1(myFrame mF) {   your code ... }
0 голосов
/ 22 мая 2010

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

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

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 голосов
/ 22 мая 2010

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

String a = "abc";

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...