引用计数 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 个对象被初始化,p1
和 p2
。
String 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
).
考虑以下 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 个对象被初始化,p1
和 p2
。
String 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
).