本文章重点比较了一下含有static关键词的继承关系中的初始化顺序问题,现在直接贴出需要的代码:
public class Apple {
static private int i = 0;//只初始化一次:只有第一次新建对象时会执行
private int k;//每次都要进行初始化
private String s;
public Apple(){
k++;
i++;
System.out.println("applei" + i);
System.out.println("applek" + k);
System.out.println(s);
}
{
System.out.println("defeinds" + s);
s = "kaka";
}
//这块代码只有第一次新建对象时会执行
static{
System.out.println("statici" + i);
i = 4;//只有第一次初始化,之后不起作用
}
public static int getI() {
return i;
}
public static void setI(int i) {
Apple.i = i;
}
}
public class Fruit extends Apple{
private int f = 2;
public Fruit(){
System.out.println("Fruit" + f);
}
{
System.out.println("Fruit defeind" + f);
f++;
}
}
public class AppleDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
new Fruit();
new Fruit();
}
}
运行的结果:
statici0
defeindsnull
applei5
applek1
kaka
Fruit defeind2
Fruit3
defeindsnull
applei6
applek1
kaka
Fruit defeind2
Fruit3
现在写出分析结果:
知识点一:
在初始化时,static修饰的变量会被优先初始化,若存在多个static变量则按static的出现顺序初始化。
知识点二:
static变量只会在第一次创建对象的时候被初始化,之后创建的对象则不会再次对它进行初始化。
知识点三:
在调用构造器之前所有的初始化已经完成。
知识点四
在子类对象初始化前会先对父类进行初始化。
最终给出初始化顺序:
超类的静态成员(静态块)
子类的静态成员(静态块)
超类的非静态成员
超类的构造函数
子类的非静态成员
子类的构造函数