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


Java语言规范的第4.3.1节规定;同一个对象可能有许多引用&";。

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

所以,我的理解是;可能有许多指向同一对象的指针&";,但是,我们怎么能有许多指针,它们意味着不同的地址,都指向同一个对象呢?某个对象可以有不同的地址吗?

这只是意味着"许多变量都可以引用同一个东西"。

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)和其他一些运算符("取消引用"——他们的意思是,在java术语中:遵循映射并挖掘。

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

不要认为引用有一个数字值来指示它在内存中的位置。这是一个C的东西(是的,java在引擎盖下是这样工作的,但这就是重点:它在引擎盖下面;不可能看到这个数字,与它交互,对它进行算术运算等等。事实上,在大多数JVM上,这个"数字"不是内存地址,无论如何都不是直接的(。

你似乎把它解释为:对于任何特定的对象,许多不同的"内存地址"都可以引用它。这不是它的意思。这只是意味着:多个变量可以保持相同的值。

这就像一样微不足道

int x = 5;
int y = 5;

也许你有点困惑,因为这似乎非常明显,但这正是§4.3.1所阐述的。

Obj newObj = new Obj();

这在内存中从类"创建一个新对象;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;
}
}

这些东西清理干净了吗?

最新更新