1. 构造器没有参数
创建爷爷类
public class GrandFather {
public GrandFather() {
System.out.println("爷爷");
}
}
创建父亲类
public class Father extends GrandFather {
public Father() {
System.out.println("爸爸");
}
}
创建A类
创建儿子类
public class A {
public A() {
System.out.println("A");
}
}
public class Son extends Father {
public Son() {
System.out.println("儿子");
}
A a = new A();
public static void main(String[] args) {
new Son();
}
}
运行结果:
爷爷
爸爸
A
儿子
结论:
- 构造过程是从父类“向外”扩散的,所以父类在子类构造器可以访问它之前,就已经完成了初始化,即使没有Son类的构造器,编译器也会默认合成一个构造器,然后调用父类的构造器。
- 虽然Son的构造方法在new A()之前,但是还是先执行了new A(),在执行Son的构造方法。也就是Son构造器初始化的时候会执行除构造函数和其他方法之外的其他代码;
接着在main方法中加入
getSuperClass(son.getClass());
getSuperClass方法体
private static void getSuperClass(Class t) {
System.out.println(t.getSuperclass());
while (t!=null){
getSuperClass(t.getSuperclass());
}
}
结果:
爷爷
爸爸
A
儿子
class javabianchengsixiang.Seven.Father
class javabianchengsixiang.Seven.GrandFather
class java.lang.Object
null(报异常)
结论:虽然没有显示的继承Object类,但是Son构造器会隐式的继承Object类
2. 构造器有参数
创建爷爷类
public class GrandFather {
public GrandFather(int i) {
System.out.println("爷爷");
}
}
注意:创建父亲类
编译器提示我们不能这样创建;
解决办法有两种:
- 在爷爷类中显示的加入构造方法
- 使用super关键字,像这样:
public class Father extends GrandFather {
public Father() {
super(666);
System.out.println("爸爸");
}
}
儿子类
public class Son extends Father {
public Son() {
System.out.println("儿子");
}
public static void main(String[] args) {
Son son = new Son();
}
}
结果:
爷爷666
爸爸
儿子
结论:如果父类中的构造器有参数,则子类必须使用super关键字来继承。
来源:CSDN
作者:征鸿Sir
链接:https://blog.csdn.net/qq_34319334/article/details/104570299