为什么我们被允许在同一个类中创建一个类的对象?

时间:2016-01-12 14:22:59

标签: java

我只是想弄清楚为什么可以做这样的事情,但在C ++这样的其他编程语言中是不可能的。 以下是我要问的一个例子:

public class A{
    private A objectOfTheSameClass;
    public A()
    {
       objectOfTheSameClass=new A();
    }
}

2 个答案:

答案 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”模式中通过创建与类字段相同的类的对象来使用一个类的实例,使其可以通过公共方法访问并使其成为构造函数私有。

直到运行时才创建实例,因此完全定义了类。你应该以正确的方式使用它。