在c++primer中看到这么句话“因为只有当类定义体完成后才能定义类,因此类不能具有自身类型的数据成员。然而,只要类名义出现就可以认为该类已经声明,因此,类的数据成员可以是指向自身类型的指针或引用”
java中没有这么限制,先实验下:
public class A {
A a = new A();
// A a;
A(){
System.out.println("create A");
// a = this;
}
public static void main(String[] args)
{
new A();
}
}
运行出现异常,Exception in thread "main" java.lang.StackOverflowError
下面分析一下,这么做的问题,当在A中保存有A类型的对象,并为之进行初始化操作。当我们(1)创建一个new A()时,由于创建的对象自身包含一个A类型的对象,所以初始化对象时要为A创建new A()的实例,这时程序又返回到(1)处执行。无限制的创建As()对象,因此会产生StackOverflowError异常。
注意类似下面的代码将会出现同样的问题:
class B{
A a = new A();
}
public class A {
B b = new B();
// A a;
A(){
System.out.println("create A");
// a = this;
}
public static void main(String[] args)
{
new A();
}
}