小编在类的继承中已经提到相关知识,但没有进行系统性的讲解。今天在这里补上,希望能够帮助大家更深层次的理解构造函数在类继承成中情况。
构造函数在父子类出现共有以下几种情况:
1、父类含有无参构造:这时候我们不需要显式的使用super()去继承父类,应为编译时系统会默认加上super()。
代码示例:
public class Test {
public static void main(String[] args) {
new Son();
}
}
// 父类
class Father {
Father() {
System.out.println("我是父类");
}
Father(int i, String name) {
}
}
// 子类
class Son extends Father {
Son() {
System.out.println("我是子类");
}
}
图片示例:
2、父类没有无参构造:因为你在父类中创建了有参构造方法,所以系统不会再父类默认创建无参构造方法,而子类中默认创建的super()无法找到父类的无参构造编译不通过,以下有两种解决方案。
(1)、在子类构造方法中第一行显式的调用父类有参构造方法:
public class Test {
public static void main(String[] args) {
new Son( "小梦");
}
}
// 父类
class Father {
protected String fName = "老许";
// 有参构造
Father(String name) {
name = this.fName;
System.out.println("我是一位父亲,我的名字叫"+name);
}
}
// 子类
class Son extends Father {
// 有参构造
public Son(String sName) {
super("");
System.out.println("我的名字叫"+sName+",我的父亲是"+super.fName);
}
}
(2)、在子类构造方法中第一行使用this关键字调用本类构造方法挤掉super。
代码示例:
public class Test {
public static void main(String[] args) {
new Son( "小梦");
}
}
// 父类
class Father {
protected String fName = "老许";
// 有参构造
Father(String name) {
name = this.fName;
System.out.println("我是一位父亲,我的名字叫"+name);
}
}
// 子类
class Son extends Father {
Son() {
super("");
}
// 有参构造
Son(String sName) {
this();
System.out.println("我的名字叫"+sName+",我的父亲是"+super.fName);
}
}
总结:父类构造方法不管是显式还是隐式的子类在继承时的每个构造方法中含有父类的构造方法有且仅有一个。
有的小伙伴就说你上面的代码不就演示了子类的构造方法中没有继承父类的构造方法吗?这不是搬起石头砸自己的脚吗?其实是你对代码还没有理解的透彻,别急接下来由小编为你解答。
实际上你使用this关键字调用子类构造方法其实还是间接继承的父类构造方法,代码代码的执行过程如下图:
上图所展示的橙色部分是不是还是调用了父类的构造方法,就如同我们生活中的父子关系一样,就算你再这么撇清与你的父亲的关系,但还是总是有着千丝万缕。
今天内容就到这,喜欢小编的就为小编点点赞和关注,拜拜!