Это не имеет ничего общего ни с передачей по значению или передачей по ссылке, ни с new
. Здесь вам нужно понять разницу между переменной, выражением и ссылкой. Ключевая строка такова:
SomeObject[] animals = {aardvark, llama, tiger, chicken};
Это синтаксический сахар для создания массива и заполнения его ссылками. Внутри фигурных скобок происходит то, что существует список выражений, которые оцениваются. Эти выражения являются переменными, которые вы объявили и инициализировали ранее, но переменные - это просто имена адресов памяти, содержащих ссылки на объекты. Выражения оцениваются для содержимого адресов памяти (ссылок), которые помещаются в массив - это неявно создает копии ссылок. Поэтому скопированные ссылки полностью независимы от переменных. Может быть, это станет легче понять, если учесть это:
SomeObject[] animals = {aardvark, llama, tiger, new SomeObject()};
Здесь последнее выражение использует new
для создания объекта. Выражение оценивается как ссылка на вновь созданный объект, который помещается в массив как ссылка only на этот объект - там нет никакой переменной , которая ссылается на него напрямую! *