Java中的对象和引用

Kor*_*lex 2 java reference object

在Java中,所有变量都按值传递.对于对象,这意味着我们传递对象的引用.我对以下情况感到困惑.假设我们有一个对象图.一个对象包含对另一个对象的字段引用,该对象引用了另一个对象,如:user.address.city.这里我们有类User的实例,该实例引用了类Address的实例,该类具有String - city类型的字段.现在假设我们有2个用户:

User bob = new User();
User mary = new User();
Run Code Online (Sandbox Code Playgroud)

假设对象'bob'引用了地址对象:

Address bobAddress = new Address();
bobAddress.setCity("New York");

bob.setAddress(bobAddress);
Run Code Online (Sandbox Code Playgroud)

让我们说玛丽和鲍勃开始住在一个房子里,他们有相同的地址,没问题:

mary.setAddress(bobAddress);
Run Code Online (Sandbox Code Playgroud)

现在,mary和bob引用了一个地址对象.但是有一天他们离婚和玛丽现在还有另一个地址:

mary.getAddress().setCity("Boston");
Run Code Online (Sandbox Code Playgroud)

在这里我们遇到了一个问题:Mary在她的地址中改变了一些内容,但她也更改了Bob的地址,因为他们共享相同的引用.

上面的所有文字都是我尝试以小规模描述一个大问题:当我在将该对象的引用设置为另一个实例之前创建一个对象的副本(克隆)时?是否存在某些规则或技术?我知道使用这些对象的不可变对象(例如String,Integer ...),我们根本不需要考虑这些问题,但如果我有可变对象怎么办呢.我应该如何表现?

DwB*_*DwB 7

你的问题表明Address班级设计不好.

Address类表示地理位置并且是固定的.当个人移动时,地理位置不会改变; 相反,个人居住的地理位置会发生变化.

删除Address的setter并使其成为不可变对象.当个人移动时,您必须执行以下操作之一:

  1. 如果个人与另一个人共享现有地址(对象实例),则分配现有参考.
  2. 如果个人移动到新地址(新对象实例),则将地址分配给新的Address实例.