1 对于继承来讲,初始化次序大致如下:
1)父类的静态变量和静态块。父类的静态变量和静态块的初始化次序是按代码次序执行。
2)子类的静态变量和静态块。子类的静态变量和静态块的初始化次序同父类。
3)父类的非静态变量和非静态块。他们之间初始化次序按代码次序执行。此时如果对象中所有的非静态变量和非静态块没有直接赋值,将执行默认的初始化。(其中非静态变量包括基本类型的变量和对象的引用)
4)父类的构造函数。调用构造函数时,会对实例变量进行初始化。
注意:1), 2)无论类是否产生对象,他们都回执行初始化;3),4)产生对象后才会执行。
5)子类的非静态变量和非静态块。他们之间初始化次序按代码次序执行。
6)子类的构造函数。参考4)
2 参考代码:
class Baseclass{
// 父类静态变量
private static int x1 =
printInit("父类静态变量");
// 父类 静态块
static{
printInit("父类 静态块");
}
// 父类非静态变量
private int i = printInit("父类非静态变量");
// 父类非静态块
{
print("父类非静态块");
}
// 父类构造函数
Baseclass(){
print("父类构造函数");
i = 39;
}
static int printInit(String s){
print(s);
return 47;
}
// Print with a newLine:
static void print(Object obj){
System.out.println(obj);
}
}
public class Subclass extends Baseclass{
// 子类静态变量
private static int x2 =
printInit("子类静态变量");
// 子类 静态块
static{
printInit("子类 静态块");
}
// 子类非静态变量
private int j = printInit("子类非静态变量");
// 子类非静态块
{
print("子类非静态块");
}
// 子类构造函数
Subclass(){
print("子类构造函数");
j = 39;
}
public static void main(String[] args) {
Subclass s = new Subclass();
}
}
3 代码或者概念解释不清楚的地方,请热心的读者积极指出。