На самом деле в Java ссылки передаются по значению .
В этом случае ссылка является объектом byte[]
. Любые изменения, которые влияют на сам объект, будут видны из метода вызывающей стороны.
Однако, если вы пытаетесь заменить ссылку, например, с помощью new byte[length]
, вы заменяете только ссылку, полученную путем передачи по значению, поэтому вы не меняете ссылку в методе вызывающего абонента.
Вот интересное прочтение об этой проблеме: Ява, черт возьми, передается по значению!
Вот конкретный пример:
public class PassByValue
{
public static void modifyArray(byte[] array)
{
System.out.println("Method Entry: Length: " + array.length);
array = new byte[16];
System.out.println("Method Exit: Length: " + array.length);
}
public static void main(String[] args)
{
byte[] array = new byte[8];
System.out.println("Before Method: Length: " + array.length);
modifyArray(array);
System.out.println("After Method: Length: " + array.length);
}
}
Эта программа создаст массив byte
длины 8
в методе main
, который вызовет метод modifyArray
, в котором создается новый массив byte
длины 16
.
Может показаться, что при создании нового массива byte
в методе modifyArray
длина массива byte
при возврате к методу main
будет 16
, однако при запуске этой программы раскрывает что-то другое:
Before Method: Length: 8
Method Entry: Length: 8
Method Exit: Length: 16
After Method: Length: 8
Длина массива byte
после возврата из метода modifyArray
возвращается к 8
вместо 16
.
Почему это?
Это потому, что метод main
вызвал метод modifyArray
и отправил скопированную ссылку на new byte[8]
с использованием передачи по значению . Затем метод modifyArray
отбросил скопированную ссылку, создав new byte[16]
. К тому времени, когда мы оставляем modifyArray
, ссылка на new byte[16]
выходит за рамки (и в конечном итоге будет собирать мусор). Однако метод main
по-прежнему имеет ссылку на new byte[8]
, поскольку он только отправил скопированную ссылку , а не фактическую ссылку на ссылку.
Это должно продемонстрировать, что Java будет передавать ссылку, используя передачу по значению.