abstract class Father{
public Father()
{
System.out.println("In abstract Father constructor...");
}
public static void main(String as[]) {
System.out.println("In abstract Father main...");
}
}
class Child extends Father{
public Child()
{
System.out.println("In child constructor...");
super();
}
public static void main(String as[]) {
System.out.println("In child main...");
}
}
请问此段代码是否能编译通过,并输出值?
答案是不能编译通过,因为父构造函数是有参数的。所以子类构造函数需要显式声明并且先调用其父构造函数,待其父构造函数执行完毕才能执行其自身构造函数的初始化,所以只有调换Child中构造函数中两行代码的顺序才能编译通过。
class A
{
public A(String a)
{
System.out.println("A");
}
}
class B extends A
{
public B()
{
super(null);
System.out.println("B");
}
}
class C extends B
{
public C(String a)
{
super();
System.out.println("C by constructor C(String a)");
}
public C()
{
System.out.println("C by constructor C()");
}
}
这段代码说明两个构造函数中的两个特性:
1.构造函数在初始化完毕之前首先调用其父构造函数,以此类推一直至最高父级。
2.构造函数对于默认构造函数即便不显式声明super()也没有关系,因为编译器会为其自动添加super()代码,前提是其父构造函数必须有无参构造函数。