引用计数 Java

Reference counting Java

考虑以下 java 代码:

class Person {
    String name;
    int age;
}

Person p1 = new Person();
Person p2 = new Person();
Person p3 = p2;
p3 = p1;

这里总共创建了多少个对象和引用变量? name 是否已创建,即使它从未被实例化?创建了 2 个对象,但是否有 3 个或 5 个引用变量?

2 个对象被初始化,p1p2String name 将默认为 null 但有一个引用,因此有 2 个引用,每个 Person 实例化一个。 int 是一个原始值,默认为 0,这里没有任何对象。 p3 是参考。 最后一行是赋值,这里什么都没有创建。

答案是 5。

例如,变量与原始类型一起保存在堆栈上的内存中。对象保存在堆上,所以创建时例如:

Person p1 = new Person() 将保存在堆栈 p1 上,并在堆内存上分配对象 Person 的内存。堆栈中的 p1 将引用堆上分配的位置。在堆上,我们为名称等属性或 class 中的方法分配内存。当只声明一个person的变量时,变量只保存在栈上,所以不会在堆上分配新的内存。

当我们执行 Person p3 = p2 时会发生什么? 它将在堆栈上为我们的变量分配内存,它只会添加对保存 p2 的地方的引用。

对于您的示例,最后我们将分配 3 个点(用于 p1、p2、p3),而在堆上我们将仅分配 2 个点(用于 p1 和 p2)。 p3 将首先引用 p2,然后将引用 p1。总共我们将为对象 p1、p2、p3 创建从堆栈到堆的 3 个引用,然后我们将为字符串创建 2 个引用。我们总共有 5 个参考文献。

两个对象(p1, p2)三个变量(name, age, p3).