Java中构造函数的陷阱


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()代码,前提是其父构造函数必须有无参构造函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值