我是靠谱客的博主 沉静季节,最近开发中收集的这篇文章主要介绍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(),即父类的无参构造方法(如果父类无任何构造方法, 则系统为父类自动提供一个无参构造方法; 如果父类已经有一个构造方法, 系统不会额外提供无参的构造方法,此时, 如果父类仅定义了有参构造方法, 并且子类没有定义任何的构造方法(系统会为它提供一个无参构造方法, 然后隐式调用父类无参构造方法), 或子类定义的构造方法中没有显式调用父类的有参构造方法(会隐式调用父类的无参构造方法), 就都会因为父类没有无参构造方法而报错。




最后

以上就是沉静季节为你收集整理的java 构造方法 super 隐式调用 显式调用的全部内容,希望文章能够帮你解决java 构造方法 super 隐式调用 显式调用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部