class Test1 {
static {System.out.println("静态块");}
int i=10;
boolean b=false;
char c = 'A'; {System.out.println(i);}
Test1() {
super();//Object
print();
i = 20;
}
void print() {
System.out.println(b);
System.out.println(c);
}
}
class Test2 extends Test1 {
{System.out.println("子类成员块");}
int i=30;
static {System.out.println("子类静态块");}
Test2() {
super();//Test1
print();
i=40;
}

void print() {
System.out.println(i);
}
}
public class Test4 {
public static void main(String args[]) {
System.out.println(new Test2().i);
}
}

解决方案 »

  1.   

    类的初始化顺序问题:
    先初始化父类静态块
    执行:static {System.out.println("静态块");} 1、输出: 静态块
    然后子类静态块:static {System.out.println("子类静态块");} 2、输出: 子类静态块
    父类成员块{System.out.println(i);} 3、输出: 10
    父类构造函数调用:
    由于多态会调用子类的print()方法;而此时子类的成员变量还没有初始化:
    4、输出: 0
    子类成员初始化:{System.out.println("子类成员块");} 5、输出: 子类成员块
    子类构造函数调用:
    调用print()方法,并且i赋值为40
    6、输出: 30
    System.out.println(new Test2().i); 
    7、输出: 40
      

  2.   

    哇 好详细,谢谢指教。不过我这里特意添加的System.out.println(c);等语句为什么不执行?也就是说父类构造体中为什么不执行,是不是因为被子类中覆写了?
      

  3.   


    是的,它由于多态调用于子类的print方法