繁体   English   中英

如果我们声明一个对象并将其分配给同一类的另一个对象,将会发生什么

[英]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;

您使AB指向FirstClass(2) ,“无”指向FirstClass(1) ...,并且由于没有“指向”,因此FirstClass(1)可以使用GC。

Java中的变量有两种。 它们要么是原始类型(例如intboolean ),要么是Object类型。 原始值总是在赋值时复制,但对象变量就像C ++中的指针一样。 如果将一个Object变量分配给另一个变量,则只是在更改它指向的内存位置,而不是创建目标的新“复制”实例。

这是C ++和Java的区别之一。 当您在C ++中将一个对象分配给另一个对象时,它将一个对象的值复制到另一个对象。 而在Java中,它将声明A为对B指向的对象的引用。由于现在JVM丢失了对B的引用并且无法再对其进行访问,因此它成为合格的GC候选对象。

在Java中, AB实际上是指针。 但是在您的C ++代码中却不是。 那是唯一的区别。

如果将C ++ AB更改为指针,您将看到这两段代码现在是等效的:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM