不明白为什么子类必须显式调用具有参数的基类构造函数

时间:2013-11-13 06:34:05

标签: java

似乎没有意义的子类被强制调用基类的构造函数。如果用户可以创建自己的构造函数而不限于基类,那么它将更加灵活。任何人都可以告诉我为什么在JAVA中强制这种行为?这有什么好处?

class A
{                                                                                                    
  public A(String s)
  { 
    System.out.println(s);
    System.out.println("BASE parameter constructor");
   }   
}

class C extends A
{  
       public C(String s)   
       {
        super(s);// why here compiler force to call constructor of base class
        System.out.println("Sub parameter constructor");
        }
}

3 个答案:

答案 0 :(得分:5)

因为基类没有no-arg构造函数,默认情况下从子类调用。

如果你喜欢这样做

public C(String s)
    {
        System.out.println("Sub parameter constructor");
    }

然后将对超级构造函数的默认调用放在那里,它将变为

public C(String s)
    {
    super();
    System.out.println("Sub parameter constructor");
    }

但是编译器不提供no-arg构造函数,因为您已经定义了参数化构造函数,因为只有在没有为类提供其他构造函数时才提供它。

答案 1 :(得分:1)

创建新类时,不必指定构造函数。 Java在编译期间隐式为您创建一个。这样的构造函数称为默认构造函数。

如果您的类没有指定构造函数,并且您继承了该类,则类似地,您不必显式提供构造函数。

但是,当您开始在类中使用构造函数时,Java不会为您创建默认构造函数。如果构造函数至少接受一个输入参数,那么子类必须调用父类的构造函数。

答案 2 :(得分:0)

8.8.9. Default Constructor

  

如果类不包含构造函数声明,则为默认值   没有形式参数且没有throws子句的构造函数   隐含地宣布。

     

如果声明的类是原始类Object,那么   默认构造函数有一个空体。否则,默认   构造函数只调用没有的超类构造函数   参数。

     

如果默认构造函数是隐式的,则是编译时错误   声明但超类没有可访问的构造函数   (§6.6)不带参数且没有抛出条款。