Я думал, что добавлю этот ответ, чтобы добавить больше деталей из Спецификаций.
Во-первых, В чем разница между передачей по ссылке и передачей по значению?
Передача по ссылке означает, что параметр вызываемых функций будет
такой же, как переданный аргумент вызывающей стороны (не значение, а личность
- сама переменная).
Передача по значению означает, что параметр вызываемых функций будет копией
переданный аргумент звонящего.
Или из Википедии, на тему передачи по ссылке
При оценке по ссылке (также именуемой
передача по ссылке), функция получает неявную ссылку на
переменная, используемая в качестве аргумента, а не копия его значения. это
обычно означает, что функция может изменить (т.е. назначить)
переменная, используемая в качестве аргумента - то, что увидит ее вызывающий.
И на предмет передачи по значению
В вызове по значению вычисляется выражение аргумента, а
Полученное значение связывается с соответствующей переменной в функции [...].
Если функция или процедура может назначать значения своим
параметры, назначается только его локальная копия [...].
Во-вторых, нам нужно знать, что Java использует в своих вызовах методов. Спецификация языка Java состояния
Когда вызывается метод или конструктор (§15.12), значения
фактические выражения аргумента инициализируют вновь созданный параметр
переменные , каждая из объявленного типа, перед выполнением тела
метод или конструктор.
Таким образом, он присваивает (или связывает) значение аргумента соответствующей переменной параметра.
Каково значение аргумента?
Давайте рассмотрим ссылочные типы, Спецификация виртуальной машины Java состояния
Существует три вида ссылочных типов : типы классов, типы массивов,
и типы интерфейсов. Их значения являются ссылками на динамически
созданные экземпляры классов, массивы или экземпляры классов или массивы, которые
реализовать интерфейсы соответственно.
Спецификация языка Java также заявляет
Ссылочные значения (часто просто ссылки) являются указателями на эти объекты и специальной нулевой ссылкой, которая не ссылается на объект.
Значением аргумента (некоторого ссылочного типа) является указатель на объект. Обратите внимание, что переменная, вызов метода с возвращаемым типом ссылочного типа и выражение создания экземпляра (new ...
) разрешаются в значение ссылочного типа.
So
public void method (String param) {}
...
String var = new String("ref");
method(var);
method(var.toString());
method(new String("ref"));
все привязывают значение ссылки на экземпляр String
к вновь созданному параметру метода, param
. Это именно то, что описывает определение передачи по значению. Таким образом, Java передается по значению .
Тот факт, что вы можете следовать по ссылке, чтобы вызвать метод или получить доступ к полю ссылочного объекта, совершенно не имеет отношения к разговору. Определение передачи по ссылке было
Как правило, это означает, что функция может изменять (т.е. назначать)
переменная, используемая в качестве аргумента - то, что увидит ее вызывающий.
В Java изменение переменной означает ее переназначение. В Java, если вы переназначите переменную в методе, она останется незамеченной для вызывающей стороны. Изменение объекта, на который ссылается переменная, - это совершенно другое понятие.
Примитивные значения также определены в Спецификации виртуальной машины Java, здесь . Значением типа является соответствующее целочисленное значение или значение с плавающей запятой, закодированное соответствующим образом (8, 16, 32, 64 и т. Д. Биты).