2017-04-20 60 views
0
Class Test { 
    Test variable1 = null; 
    Test variable2 = new Test(); 
} 

我们可以用两个变量执行类似的功能吗?在同一个类中创建一个类的引用变量是否正确?与使用新关键字创建的常规对象有什么不同?

+0

什么时候你会停止定义Test对象? – synchronizer

+1

'variable2'将导致StackOverflowException,因为*在创建时*每个Test实例都需要自己的Test实例,这需要自己的Test实例,依此类推。 – Pshemo

+0

要清楚,可以将具有与类相同类型的引用变量。正因为如此,我们可以拥有像LinkedList这样的结构,它内部具有'Node',用于保存对另一个Node的引用。问题的实质是,在'variable2'中你正在用你的类的另一个实例初始化它。这个初始化将移动到每个构造函数,这将导致无限递归和堆栈溢出。 – Pshemo

回答

0

如果这些成员中的每一个都用new Test()进行初始化,那么最终会以无限递归。所以不,这不可能。

递归必须在某处停止,例如,用空值。

除此之外,具有与类本身相同类型的实例变量没有任何问题。这是一个完全正常的变量。

4

在 同一类中创建类的引用变量是否正确?

是的,这是正确的

会让您更明白一个例子,考虑你有一个类

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); 

就像你看到的,你可以用你的构造玩,就像你想要的。

+1

nope @Aganju这是不正确的 –

+0

@Aganju检查我已经提到的例子,你会明白,这不是'导致无限递归':) –

+2

@Aganju术语“参考变量”在这里是不正确的。你的意思是一个实例变量。它只会导致无限递归,如果它直接分配给一个实例,而该实例又会导致创建相同类或子类的对象。如果要分配给变量的对象被传递给构造函数或者在构造之后分配,这不是问题。 –

0

你只拥有一个无限循环(堆栈溢出错误),如果你试图做到以下几点:

Class Test { 
    Test variable2 = new Test(); 
} 
0

目前您的变量是实例变量,这意味着它们具有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(); 
} 

这些将被静态成员,与测试属于类,而不是特定的测试例如

相关问题