在同一个类中创建一个类的引用变量是否正确?与使用新关键字创建的常规对象有什么不同?
Class Test {
Test variable1 = null;
Test variable2 = new Test();
}
我们可以用两个变量执行类似的功能吗?在同一个类中创建一个类的引用变量是否正确?与使用新关键字创建的常规对象有什么不同?
如果这些成员中的每一个都用new Test()
进行初始化,那么最终会以无限递归。所以不,这不可能。
递归必须在某处停止,例如,用空值。
除此之外,具有与类本身相同类型的实例变量没有任何问题。这是一个完全正常的变量。
在 同一类中创建类的引用变量是否正确?
是的,这是正确的
会让您更明白一个例子,考虑你有一个类人:
class Person {
String name;
int age;
Person mother;
Person father;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, Person mother, Person father) {
this.name = name;
this.age = age;
this.mother = mother;
this.father = father;
}
}
每个人是有母亲和父亲一人,母亲和父亲是人。
例如您:
Person p1 = new Person("Son Name", 22,
new Person("Mother name"), 45), new Person("Father name"), 50));
或者你可以这样创建:
Person mother = new Person("Mother name", 45);
Person father = new Person("Father name", 50);
Person son = new Person("Son name", 22, mother, father);
就像你看到的,你可以用你的构造玩,就像你想要的。
nope @Aganju这是不正确的 –
@Aganju检查我已经提到的例子,你会明白,这不是'导致无限递归':) –
@Aganju术语“参考变量”在这里是不正确的。你的意思是一个实例变量。它只会导致无限递归,如果它直接分配给一个实例,而该实例又会导致创建相同类或子类的对象。如果要分配给变量的对象被传递给构造函数或者在构造之后分配,这不是问题。 –
你只拥有一个无限循环(堆栈溢出错误),如果你试图做到以下几点:
Class Test {
Test variable2 = new Test();
}
目前您的变量是实例变量,这意味着它们具有Test
实例属于如果你创建它。但是,variable2
总是会导致一个stackoverflow错误。假设你做new Test()
:
Test t1 = new Test(); - > t1.variable1初始化为null,t1.variable2初始化为new Test(); - > t1.variable2.variable2初始化为新的Test(); ...
它不停地递归。所以直接初始化实例变量不是一个选项。你必须通过setter或构造函数初始化它。这是完全有效的。一个类可以拥有自己类型的实例成员。毕竟,面向对象的用例有些东西可以包含一个或多个本身的实例。一个树结构将是一个典型的例子:每个节点可以包含多个子节点,这些子节点又可以包含更多的子节点。
请注意,如果你做这些静态的,你将能够立即初始化实例:
Class Test {
static Test variable1 = null;
static Test variable2 = new Test();
}
这些将被静态成员,与测试属于类,而不是特定的测试例如 。
什么时候你会停止定义Test对象? – synchronizer
'variable2'将导致StackOverflowException,因为*在创建时*每个Test实例都需要自己的Test实例,这需要自己的Test实例,依此类推。 – Pshemo
要清楚,可以将具有与类相同类型的引用变量。正因为如此,我们可以拥有像LinkedList这样的结构,它内部具有'Node',用于保存对另一个Node的引用。问题的实质是,在'variable2'中你正在用你的类的另一个实例初始化它。这个初始化将移动到每个构造函数,这将导致无限递归和堆栈溢出。 – Pshemo