Java中的构造函数本质上是静态的还是非静态的?

时间:2017-11-09 19:37:30

标签: java constructor

有一个类似的问题 Constructor is static or non static

但很少有答案告诉构造函数是静态的,很少有人告诉构造函数是非静态的。这令人困惑。那么有人可以澄清构造函数本质上是静态的还是非静态的?

2 个答案:

答案 0 :(得分:4)

这是Java规范中关于构造函数的内容,在§8.8.3. Constructor Modifiers中:

  

与方法不同,构造函数不能是abstractstaticfinalnativestrictfpsynchronized

     
      
  • 不继承构造函数,因此无需声明它final

  •   
  • 永远无法实现abstract构造函数。

  •   
  • 总是会根据对象调用构造函数,因此构造函数为static是没有意义的。

  •   
  • 构造函数没有实际需要synchronized,因为它会锁定正在构造的对象,在对象的所有构造函数完成其工作之前,通常不会将其提供给其他线程

  •   
  • 缺少native构造函数是一种随意的语言设计选择,它使Java虚拟机的实现很容易验证在创建对象期间始终正确调用超类构造函数。

  •   
  • 无法将构造函数声明为strictfp(与方法(§8.4.3)相反)是有意的语言设计选择;它有效地确保构造函数是FP严格的,当且仅当它的类是FP-strict(§15.4)。

  •   

答案 1 :(得分:1)

我不确定哪个答案让你感到困惑。但在Java中,构造函数并不是静态的。

请参阅以下示例:

public class MyTest {
    public static void main(String[] args) {
        new Test(); // Prints reference within the constructor
        new Test(); // The reference is different here
    }
}

class Test {
    public Test() {
        System.out.println(this.toString());
    }
}

正如您所看到的,通过两次调用构造函数,您将获得对该对象的两个不同引用。这意味着构造函数的上下文不是静态的。

您的类中可能有工厂方法,这些方法是静态的并且创建实例:

班级考试{

// May be called like Test.create() and returns instance
public static Test create() {
    return new Test();
}

但是在这些方法中,你仍然需要调用类构造函数。正如我之前演示的那样,这不是一成不变的。