Ссылка на объект Java / вопрос области - PullRequest
8 голосов
/ 08 марта 2009

Если у меня есть переменная-член, такая как эта (объявлена ​​в теле класса)

private Dot[] dots=new Dot[numDots];

Я перебираю все элементы этого массива и:

1) Передать каждый объект Dot в функцию другого класса, которая:

2) Передает его еще одной функции 3-го класса, если выполняются некоторые условия

3) И третий класс меняет некоторые свойства объекта Dot

затем, когда этот объект возвращается в исходный / родительский класс, сохранятся ли эти изменения в его свойствах? Или 2-я / 3-я функции будут рассматриваться как локальная переменная?

Ответы [ 2 ]

12 голосов
/ 08 марта 2009

Да, изменения в свойствах сохраняются. Java на 100% передается по значению, однако, когда вы передаете объект, переданное «значение» действительно является указателем на объект. Таким образом, когда вы изменяете объект в методе, вы изменяете фактический переданный объект.

То есть, если у вас есть следующий метод, то вызывающий метод увидит изменения:

private void updateMyDot(final Dot aDot) {
  aDot.dotColor = new Color(255,255,255);
}

но если вы выполните следующее, то вызывающий метод не увидит изменения.

private void updateMyDot(/* not final */ Dot aDot) {
  aDot = new Dot();
  aDot.dotColor = new Color(255,255,255);
}

Во втором примере вызывающая сторона не увидит какие-либо изменения и не увидит вновь созданный объект Dot.

2 голосов
/ 08 марта 2009

Объекты передаются значением [ reference , где значением является ссылка ] (вещи, которые наследуются от Object), примитивные значения (int, long, double и т. Д.) передается по значению.

Это означает, что когда примитив передается из вызывающего в метод, он копируется, тогда как с объектом передается [ значение ссылки ].

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

И наоборот, когда метод мутирует примитив, вызывающая сторона не видит изменений, так как метод работает с копией.

[причина правок]

Если бы Java передавалась по ссылке, вы могли бы сделать это:

Object x;

x = new Integer(42);
foo(x);
System.out.println(x.getClass()); // pass by reference would have it print out java.lang.Float

где foo определяется как:

void foo(Object o)
{
   o = new Float(43);
}

Поскольку Java передает ссылку по значению, o = new Float(43); разрешено - но значение в вызывающей стороне останется как new Integer(42);

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