初始化顺序:
1、静态成员初始化;
先是父类中的静态成员初始化(包括静态域值和静态语句块,按照声明顺序初始化),再是子类成员初始化。这里会一直追溯到最顶层的基类哈。
静态成员的初始化发生在类被加载时,这时不一定调用了构造器。当程序试图访问某一个类时,就会加载此类。
2、非静态成员的初始化;
3、调用构造函数。
注意2和3的顺序为,父类的非静态成员的初始化---->父类构造器----->子类的非静态成员的初始化----->子类构造器。
示例如下:
[java]
public class Father {
private static int fa_static1 = printInit("static value in father!");
private int fa_instance1 = printInit("instance value in father!");
static
{
printInit("static block in father!");
}
private static int fa_static2 = printInit("another static value in father!");
{
printInit("common block in father!");
}
private int fa_instance2 = printInit("another instance value in father!");
public Father(){
System.out.println("default father constructor!");
}
public Father(int i){
System.out.println("father constructor with parameter i = " + i);
}
protected static int printInit(String s){
System.out.println(s);
return 1;
}
}
public class Father {
private static int fa_static1 = printInit("static value in father!");
private int fa_instance1 = printInit("instance value in father!");
static
{
printInit("static block in father!");
}
private static int fa_static2 = printInit("another static value in father!");
{
printInit("common block in father!");
}
private int fa_instance2 = printInit("another instance value in father!");
public Father(){
System.out.println("default father constructor!");
}
public Father(int i){
System.out.println("father constructor with parameter i = " + i);
}
protected static int printInit(String s){
System.out.println(s);
return 1;
}
}
[java]
public class Son extends Father{
private static int son_static1 = printInit("static value in son!");
private int son_instance1 = printInit("instance value in son!");
static
{
printInit("static block in son!");
}
private static int son_static2 = printInit("another static value in son!");
{
printInit("common block in son!");
}
private int son_instance2 = printInit("another instance value in son!");
public Son(){
System.out.println("default son constructor!");
}
public Son(int i){
super(i);
System.out.println("son constructor with parameter i = " + i);
}
public static void main(String[] args) {
System.out.println("------test1-----------");
Father.printInit("java");
System.out.println("------test2-----------");
Son s1 = new Son();
System.out.println("------test3-----------");
Son s2 = new Son(2);
}
}
public class Son extends Father{
private static int son_static1 = printInit("static value in son!");
private int son_instance1 = printInit("instance value in son!");
static
{
printInit("static block in son!");
}
private static int son_static2 = printInit("another static value in son!");
{
printInit("common block in son!");
}
private int son_instance2 = printInit("another instance value in son!");
public Son(){
System.out.println("default son constructor!");
}
public Son(int i){
super(i);
System.out.println("son constructor with parameter i = " + i);
}
public static void main(String[] args) {
System.out.println("------test1----