"There may be many references to the same object." 是什么意思?

What does "There may be many references to the same object." mean?

Section 4.3.1 of the Java Language Specification 指出,“可能有许多对同一对象的引用。”。

但它也指出“引用值(通常只是引用)是指向这些对象的指针,以及一个特殊的空引用,它不引用任何对象。

所以,我的理解是“可能有很多指向同一个对象的指针。”,但是我们怎么会有很多指针,这意味着不同的地址,都指向同一个对象?某个对象可以有不同的地址吗?

Obj newObj = new Obj();

这会在内存中创建一个新对象,来自 class“Obj”。

Obj newObj = new Obj();
Obj a1 = newObj;
Obj a2 = newObj;
Obj a3 = newObj;

a1,a2 和 a3 都引用同一个对象,也就是说,它们都指向 同一个对象。例如,如果您更改了 a2

中的值
System.out.println(a3.name) //prints carl
a2.name = "bob"
System.out.println(a3.name) //prints bob

它改变了a2指向的内存中对象的值。在这种情况下,该对象是 newObj。

这是一个你可以玩的小例子:

  class Main{
  public static void main(String[] args) {
    Book b = new Book("ey");
    Book b1 = b;
    Book b2 = b;
    System.out.println(b1.title); //ey
    System.out.println(b2.title); //ey
    System.out.println(b.title); //ey
    b2.title = "ok";
    System.out.println(b1.title); //ok
    System.out.println(b2.title); //ok
    System.out.println(b.title); //ok
  }
}

 class Book {
  public String title;
  public Book(String t){
    title = t;
  }
}

这是否清理了东西?

就是'many variables can all be referencing the same thing'.

List<String> list1 = new ArrayList<String>();
List<String> list2 = list1;

list1.add("Hello");
System.out.println(list2);

即使我们从未调用过 list2.add,上面的代码也会打印 'Hello'。那是因为 list1 变量和 list2 变量都在引用同一个对象,因此,如果你在取消引用 list1 时向你到达的对象添加一些东西,如果你取消引用 list2(println 代码最终执行的操作)。

java 中的非原始类型的变量(无论是字段、局部变量还是参数)就像是通往埋藏在沙子中的宝藏的地图。 . 运算符(以及 []synchronized (x) 和其他一些运算符)'dereference' - 他们的意思是,在 java 术语中:遵循地图和挖掘。

第 4.3.1 节试图说:对于任何给定的宝藏,可能有很多地图都指向它。

不要将引用视为具有指示其在内存中的位置的数值。那是 C 的东西(是的,java 有点像引擎盖下的工作,但这就是重点:它在引擎盖下;不可能看到这个数字,与之交互,对其进行算术运算等. 事实上,在大多数 JVM 上,'number' 不是内存地址,反正不是直接的)。

您似乎将其解释为:对于任何特定对象,许多不同的 'memory addresses' 可以引用它。这不是它的意思。它只是意味着:多个变量可以持有相同的值。

它和以下一样琐碎:

int x = 5;
int y = 5;

也许您有点困惑,因为这看起来非常明显,但这就是 §4.3.1 所阐明的内容。