考虑以下 Java 代码片段:
Customer obj1 = new Customer();
Customer obj2 = new Customer();
Customer obj3 = obj2;
obj3 = obj1;
这里创建了多少引用变量和对象?我遇到的解决方案都令人困惑。请解释。
后
Obj3= Obj1;
您将有两个对象和 3 个引用。Obj1 和 Obj3 将引用同一个对象。
Customer Obj1= new Customer();
// Customer 对象在堆上创建,obj1 引用它
Customer Obj2= new Customer();
//客户对象在堆上创建,obj2引用它
Customer Obj3= Obj2;
// obj3 将引用 obj2 创建的客户对象
Obj3= Obj1;
// obj3(之前引用 obj2 创建的 cust obj 将丢失)现在将引用 obj1 创建的 cust obj
因此我会说2 个对象和 3 个 ref 变量
尽管 JLS 没有禁止它,但 AFAIK 没有 JVM 使用引用计数,它太不可靠了。注意:C++ 智能指针使用引用计数,但这些非常低效。
您最多可以对两个不同的对象进行三个引用。
注意:除非您的代码对它们有用,否则 JVM 可以将此代码优化为一无所有,在这种情况下,您将没有引用或对象。
假设custObj2
用 初始化new
,并且从上面的代码片段中,它的 3 个对象(包括custObj2
)和四个引用(包括Obj3
)
创建了三个变量和两个对象。
创建了 2 个对象(前 2 行)。
创建了 3 个引用变量(Obj1、Obj2 和 Obj3 都是引用变量。)
最后两行简单地将对 2 个不同对象的引用分配给 Obj3。
迭代地遍历它...
Customer Obj1= new Customer();
创建了一个由 Obj1 引用的新对象
Customer Obj2= new Customer();
创建的第二个对象,由 Obj2 引用
Customer Obj3= custObj2;
Obj3,一个引用变量,引用custObj2
(这组数据中不存在,我们假设它是之前创建的?)
Obj3= Obj1;
Obj3 被重新分配为指向 Obj1。
最后,您有三个引用,Obj1、Obj2 和 Obj3 以及 2 个对象(前两个语句),最后是一个模棱两可的custObj2
……如果您打算键入 Obj2,则忽略该部分:)