似乎没有意义的子类被强制调用基类的构造函数。如果用户可以创建自己的构造函数而不限于基类,那么它将更加灵活。任何人都可以告诉我为什么在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");
}
}
答案 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)
如果类不包含构造函数声明,则为默认值 没有形式参数且没有throws子句的构造函数 隐含地宣布。
如果声明的类是原始类Object,那么 默认构造函数有一个空体。否则,默认 构造函数只调用没有的超类构造函数 参数。
如果默认构造函数是隐式的,则是编译时错误 声明但超类没有可访问的构造函数 (§6.6)不带参数且没有抛出条款。