Ссылка на объект Java / вопрос о области применения

StackOverflow https://stackoverflow.com/questions/622944

  •  05-07-2019
  •  | 
  •  

Вопрос

Если у меня есть переменная-член, такая как 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);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top