[英]What will happen if we declare one object and assign it to another object of same class
C ++中的代码
class FirstClass
{
public:
int var;
};
int main()
{
FirstClass A, B;
A.var = 10;
B.var = 20;
cout << "Address of A : " << &A << endl;
cout << "A.var : " << A.var << endl << endl;
cout << "Address of B : " << &B << endl;
cout << "B.var : " << B.var << endl << endl;
A = B;
cout << "Address of A : " << &A << endl;
cout << "A.var : " << A.var << endl << endl;
cout << "Address of B : " << &B << endl;
cout << "B.var : " << B.var << endl << endl;
}
输出:
A的地址:0x28fefc
变异数:10
B的地址:0x28fef8
B.var:20
A的地址:0x28fefc
变异数:20
B的地址:0x28fef8
B.var:20
我知道var的内存和值发生了什么。 与上面的代码没有混淆。 关键是内存保持不同,并且两个对象仍然引用相同的旧内存位置。 表示没有未引用的内存。
Java代码;
public class FirstClass
{
public int var;
}
public class SecondClass
{
public static void main(String str[])
{
FirstClass A = new FirstClass();
FirstClass B = new FirstClass();
A = B;
}
}
做我在上面的C ++代码中所做的相同的事情。 为什么这次垃圾收集器将开始工作,并且通过执行A = B为什么我们将获得未引用的内存。
让我们更改代码只是为了提供更多上下文:
FirstClass A = new FirstClass(1);
FirstClass B = new FirstClass(2);
此时, FirstClass(1)
和FirstClass(2)
不适合使用GC,因为当前范围内有两个变量指向这些实例。 但是,执行该行时:
A = B;
您使A
和B
指向FirstClass(2)
,“无”指向FirstClass(1)
...,并且由于没有“指向”,因此FirstClass(1)
可以使用GC。
Java中的变量有两种。 它们要么是原始类型(例如int
, boolean
),要么是Object
类型。 原始值总是在赋值时复制,但对象变量就像C ++中的指针一样。 如果将一个Object变量分配给另一个变量,则只是在更改它指向的内存位置,而不是创建目标的新“复制”实例。
这是C ++和Java的区别之一。 当您在C ++中将一个对象分配给另一个对象时,它将一个对象的值复制到另一个对象。 而在Java中,它将声明A为对B指向的对象的引用。由于现在JVM丢失了对B的引用并且无法再对其进行访问,因此它成为合格的GC候选对象。
在Java中, A
和B
实际上是指针。 但是在您的C ++代码中却不是。 那是唯一的区别。
如果将C ++ A
和B
更改为指针,您将看到这两段代码现在是等效的:
FirstClass* A = new FirstClass;
FirstClass* B = new FirstClass;
A->var = 10;
B->var = 20;
A = B;
现在, A = B
复制指针,而不是指向对象,就像在Java中一样。
用Java创建琐碎的对象
SomeClass obj = new SomeClass();
如上所述,当使用java中的new
关键字创建新对象时,JVM在堆区域中分配所需的内存,并将该内存区域分配给给定的引用变量obj
。 因此,在您的情况下,它为2个对象分配内存,并将引用分配给相应的引用变量。
当你做的时候
A = B;
我们正在指示JVM分配内存引用,由B引用变量A。因此,现在A和B都指向相同的内存区域。 其他内存区域(在执行赋值语句之前实际上由A指向)没有任何引用指向,因此可以进行垃圾回收
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.