Java 构造器的秘密

1. 子类实例化也调用父类的构造函数

首先我们看看下面的代码:

class Super {
    String s;
 
    public Super(){
    	System.out.println("Super");
    }
}
 
class Sub extends Super {
 
    public Sub(){
    	System.out.println("Sub");
    }
 
    public static void main(String[] args){
    	Sub s = new Sub();
    }
}



后台结果是:

Super
Sub


在上面的代码中,其实子类并没有调用Super()这个方法,但是子类实例化的时候还是调用了父类的构造函数。这是因为,如果子类的构造器没有显示的调用super()这个方法,编译器会自动插入super()这条语句到子类构造器中。这样设计就使子类的实例化必须调用父类的构造函数,因为父类里面如果有私有的成员变量子类是无法察觉的,还是需要用父类的构造器初始化父类的私有成员变量。

2. 编译报错:父类构造器没有定义

这样的报错是因为,编译器在编译的时候,如果子类 的构造器没有显示的调用super(),编译器也会默认在子类构造器中插入super(),但此时父类并没有无参构造器,所以上面的代码就报错了。解决方案有很多种:
1. 在父类中声明一个无参构造函数
2.之类的构造器中调用super(value)
3.去掉父类中的构造函数,这样编译器会自动的为父类加一个无参构造函数

3. 总结

总之,子类的构造器一定会调用父类的构造器,不管是显示调用还是隐式的调用,父类里面一定要定义相应的构造函数。

文章来源: http://www.programcreek.com/2013/04/what-are-the-frequently-asked-questions-about-constructors-in-java/

转载于:https://my.oschina.net/u/1583086/blog/354566

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值