Ссылка на объект Java / вопрос о области применения
Вопрос
Если у меня есть переменная-член, такая как this (объявленная в теле класса)
private Dot[] dots=new Dot[numDots];
Я перебираю все элементы этого массива, и:
1) Передайте каждый точечный объект функции другого класса, которая:
2) Передает его еще одной функции 3-го класса, если выполняются некоторые условия
3) И 3-й класс изменяет некоторые свойства точечного объекта
затем, когда этот объект будет возвращен в исходный / родительский класс, сохранятся ли эти изменения в его свойствах?Или 2-я / 3-я функции будут обрабатывать ее как локальную переменную?
Решение
Да, изменения в свойствах сохраняются.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
объект.
Другие советы
Объекты передаются мимо [ссылка значение, где значение является ссылкой] (вещи, которые наследуются от Object), примитивные значения (int, long, double и т.д.) Передаются по значению.
Это означает, что когда примитив передается от вызывающего объекта методу, он копируется, тогда как с объектом a [значение] ссылка передана.
Что, в свою очередь, означает, что когда объект видоизменяется методом, вызывающий объект видит эти изменения, потому что у него есть ссылка на тот же объект.
И наоборот, когда метод изменяет примитив, вызывающий объект не видит изменений, поскольку метод работает с копией.
[причина внесения правок]
Если бы в 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);