java 构造方法 super 隐式调用 显式调用

下面是关于父类构造方法调用的实验:

当父类子类都没有定义构造方法时,系统为父类、子类提供一个无参构造方法,并在子类中隐式调用父类无参构造方法:

class Father {}

class Son extends Father {}
我们可以自己写代码来完成同样的工作:
class Father {
	public Father(){}
}

class Son extends Father {
	public Son(){
		super();
	}
}

如果我们在Father构造方法中添加一个参数:

class Father {
	public Father(int a){
        }
}

class Son extends Father {
	public Son(){ //编译器报错: The constructor Father() is undefined
		super();
	}
}

印证了一点: 如果父类已经定义了一个构造方法,则系统不会再提供无参的构造方法了。

在这种情况下, 尝试把super()删掉:
    编译器报错:Implicit super constructor Father() is undefined. Must explicitly invoke another constructor,即父类的Father无参构造方法没有定义,说明还是会隐式调用父类的无参构造方法,但是系统没有提供。

如果我们再把Son中的构造方法也删掉:

    编译器再报错:Implicit super constructor Father() is undefined for default constructor. Must define an explicit constructor,说明还是会尝试调用父类的无参构造方法

然后我们尝试在Father中添加一个无参构造方法:

class Father {
	public Father(){}
	public Father(int a){}
}

class Son extends Father {
	
}

就不会报错了。


结论:
  子类的每一个构造方法都必须显式或隐式调用父类的一个构造方法。如果不显式调用, 则系统隐式调用super(),即父类的无参构造方法(如果父类无任何构造方法, 则系统为父类自动提供一个无参构造方法; 如果父类已经有一个构造方法, 系统不会额外提供无参的构造方法,此时, 如果父类仅定义了有参构造方法, 并且子类没有定义任何的构造方法(系统会为它提供一个无参构造方法, 然后隐式调用父类无参构造方法), 或子类定义的构造方法中没有显式调用父类的有参构造方法(会隐式调用父类的无参构造方法), 就都会因为父类没有无参构造方法而报错。




  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值