我可以在Java中定义`default constructor`吗?

时间:2015-04-16 17:19:59

标签: java constructor theory

我的下面的问题是理论上的,然后是实际的。 从许多在线可用的Java资源中我发现一个类的default constructor低于规范:

  1. 不带参数
  2. 没有throws条款
  3. 有一个空身
  4. Java语言specification不提供default constructor的定义,它只声明

      

    如果类(定义)不包含构造函数声明,则为默认值   构造函数是由(由编译器)隐式声明的。

    请注意,措辞implicitly declared意味着明确定义的默认构造函数是可行的。让我们考虑下面的课程:

    public class Point {
      private int x;
      private int y;
    
      public int getX() { return x; } 
      public int getY() { return y; } 
    }
    

    对于这个类,编译器将生成以下默认构造函数:

    public Point() {
      super();
    }
    

    我的问题是,如果我作为程序员将public Point() { }实现一个构造函数,它可以被称为default constructor以上的类Point吗?如果没有,那么任何明确定义的构造函数都可以被视为default constructor吗?我很欣赏某位专家或者对这个主题绝对肯定的答案。

1 个答案:

答案 0 :(得分:5)

如果显式定义任何构造函数,则它不能是默认构造函数,即使您编写的代码与编译器生成的默认构造函数完全等效。默认,这里,表示程序员没有采取任何行动。

更新:OP需要基于证据的答案

第13.4.12节“方法和构造函数声明”(JLS8)中的编译器规则:

  1. 如果在类中声明没有构造函数,则编译器会生成默认构造函数。
  2.   

    证据:如果非内部类的源代码不包含声明的构造函数,则隐式声明不带参数的默认构造函数(第8.8.9节)。

    1. 如果你在类中声明了一个或多个构造函数,即使它是一个无参数构造函数,所以类似于编译器生成的默认构造函数,你的显式构造函数将替换编译器生成的默认构造函数。为了进一步强调这一点,你的显式no-arg构造函数等同于编译器生成的构造函数,而不是编译器生成的构造函数。
    2.   

      证据:将一个或多个构造函数声明添加到此类的源代码将阻止此默认构造函数被隐式声明,从而有效地删除构造函数,除非其中一个新构造函数也没有参数,从而替换默认构造函数

相关问题