1

子类被迫显式调用基类的构造函数似乎没有意义。如果用户可以创建自己的构造函数并且不限于基类,它将更加灵活。任何人都可以告诉我为什么在 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");
        }
}
4

3 回答 3

5

因为基类没有默认从子类调用的无参数构造函数。

如果你只是这样做

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

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

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

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

于 2013-11-13T06:35:40.403 回答
1

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

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

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

于 2013-11-13T06:50:42.790 回答
0

8.8.9。默认构造函数

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

如果声明的类是原始类 Object,则默认构造函数的主体为空。否则,默认构造函数只是调用不带参数的超类构造函数。

如果隐式声明了默认构造函数但超类没有可访问的构造函数(第 6.6 节),该构造函数不接受任何参数并且没有 throws 子句,则这是编译时错误。

于 2013-11-13T06:49:16.513 回答