我只是想弄清楚为什么可以做这样的事情,但在C ++这样的其他编程语言中是不可能的。 以下是我要问的一个例子:
public class A{
private A objectOfTheSameClass;
public A()
{
objectOfTheSameClass=new A();
}
}
答案 0 :(得分:3)
因为没有明确禁止。
JLS section 8.8.7定义构造函数的主体不会为这种情况强制编译时错误。发生编译时错误的唯一情况是构造函数使用this
调用自身时:
构造函数通过一系列涉及
this
的一个或多个显式构造函数调用直接或间接调用自身,这是一个编译时错误。
更确切地说:
除了显式构造函数调用的可能性以及禁止显式返回值(第14.17节)之外,构造函数的主体就像方法的主体(第8.4.7节)。
由于允许方法调用自身(递归),因此也允许构造函数执行相同的操作。
这不会编译,因为它调用this
:
public class A{
private A objectOfTheSameClass;
public A() {
objectOfTheSameClass= this();
}
}
您的代码虽然可以编译,但会抛出StackOverflowError
,因为A
的构造函数会创建一个A
的新实例。编译器无法检测代码中的每个无限循环......
答案 1 :(得分:1)
它有时很有用,例如在“singleton”模式中通过创建与类字段相同的类的对象来使用一个类的实例,使其可以通过公共方法访问并使其成为构造函数私有。
直到运行时才创建实例,因此完全定义了类。你应该以正确的方式使用它。