概述
下面是关于父类构造方法调用的实验:
当父类子类都没有定义构造方法时,系统为父类、子类提供一个无参构造方法,并在子类中隐式调用父类无参构造方法:
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(),即父类的无参构造方法(如果父类无任何构造方法, 则系统为父类自动提供一个无参构造方法; 如果父类已经有一个构造方法, 系统不会额外提供无参的构造方法,此时, 如果父类仅定义了有参构造方法, 并且子类没有定义任何的构造方法(系统会为它提供一个无参构造方法, 然后隐式调用父类无参构造方法), 或子类定义的构造方法中没有显式调用父类的有参构造方法(会隐式调用父类的无参构造方法), 就都会因为父类没有无参构造方法而报错。
最后
以上就是沉静季节为你收集整理的java 构造方法 super 隐式调用 显式调用的全部内容,希望文章能够帮你解决java 构造方法 super 隐式调用 显式调用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复