我们都知道继承是JAVA三大特性之一,但很多同学都对继承初始化顺序搞不明白,那么今天我们通过一个粟子来讨论下。
先建一个基类(父类)Inserct
class Inserct {
private int i=9;
protected int j;
Inserct(){
System.out.println("i="+i+",j="+j);
j=39;
}
private static int x1=printInit("static Insect.x1 inittalized");
static int printInit(String s){
System.out.println(s);
return 47;
}
}
再写一个子类 Beetle
public class Beetle extends Inserct {
private int k= printInit("Beetle.k initialied");
public Beetle(){
System.out.println("k="+k);
System.out.println("j="+j);
}
private static int x2=printInit("static Beetle.x2 initialized");
public static void main(String[] args) {
System.out.println("==============main==================;);
Beetle beetle = new Beetle();
}
}
运行结果:
static Insect.x1 inittalizedstatic Beetle.x2 initialized
==============main==================
i=9,j=0
Beetle.k initialied
k=47
j=39
看到这里就有同学提问了:
子类中
private int k= printInit("Beetle.k initialied");
在Beetle构造函数之前运行会不会是位置在构造函数之前造成的呢?
当然,答案是“NO"
我们可以把它们调换下位置
public Beetle(){
System.out.println("k="+k);
System.out.println("j="+j);
}
private int k= printInit("Beetle.k initialied");
运行结果依然是:
static Insect.x1 inittalizedstatic Beetle.x2 initialized
==============main==================
i=9,j=0
Beetle.k initialied
k=47
j=39
此时我们可以由结果看出初始化顺序为:
1:基类静态代码块
2:子类静态代码块
3:基类非静态属性
4:基类构造函数
5:子类非静态属性
6:子类构造函数
以上顺序如果没有就跳过