В Java при передаче объекта методу в качестве параметра он на самом деле передает ссылку или указатель, к тому объекту, потому что объекты в Java являются ссылками.
В функции это имеет указатель на тот объект, который является местоположением в памяти. Я задаюсь вопросом, где этот указатель живет в памяти? Новая ячейка памяти создается однажды в функции для содержания этой ссылки?
В функции ссылка на параметр хранится в стеке. Упомянутая вещь может жить где угодно.
Когда какой-либо код вызывает метод, обычно в стеке исполняемого потока выделяется пространство, и это пространство используется для хранения параметров, которые передаются функции. Если один из параметров «является объектом», то на самом деле используется ссылка на объект; эта ссылка копируется в стек, чтобы вызываемый код мог ее найти. Важно понимать, что копируется не сам объект, а только ссылка.
В прологе вызываемого кода обычно выделяется больше места в стеке для собственных локальных переменных метода, но под ним JVM имеет указатель на кадр стека со всеми параметрами, поэтому вызываемый код может найти объект, названный параметром. Элементы, созданные с помощью 'new', будут выделяться из кучи и могут сохраняться даже после выхода из метода, но все элементы, выделенные в стеке, выгружаются, просто перемещая указатель стека обратно туда, где он был до вызова.
Объекты не являются ссылками, но вы используете ссылки везде. например
String a = "abc";
- это ссылка на строку
. Так что ссылки распространяются повсюду. Это указатели? Нет. Ссылка больше похожа на дескриптор объекта. JVM может перемещать объекты в памяти. Указатель должен измениться, чтобы отразить это. Ссылка - нет. Ссылку можно смоделировать как указатель на указатель.
Каждый параметр функции передается значением
- однако параметр не является объектом, а является ссылкой.
Итак, один и тот же объект существует с двумя ссылками на него.
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, теперь указывает, где хранится «другая строка».