public class TestJVM {
public static void main(String[] args) {
B b = new B();
}
}
class A{
public static int a_int;
private int test = 10;
{
System.out.println("A语句块 a_int :"+a_int);
System.out.println("A语句块 test :"+test);
test = 20;
}
static{
System.out.println("A静态语句块 a_int :"+a_int);
a_int =300;
//test = 10;非静态变量无法使用
}
public A(){
System.out.println("A构造器 a_int :"+a_int);
a_int =400;
System.out.println("A构造器 test :"+test);
test = 30;
}
}
class B extends A{
public static int b_int =200;
private int b_test = 10;
{
System.out.println("B语句块b_int :"+b_int);
System.out.println("B语句块 test :"+b_test);
b_test = 20;
}
static{
System.out.println("B静态语句块 b_int :"+b_int);
b_int =300;
}
public B(){
System.out.println("B构造器 b_int :"+b_int);
b_int =400;
System.out.println("B构造器 test :"+b_test);
b_test = 30;
}
}
输出如下
A静态语句块 a_int :0 1.在执行B b 时父类未加载与初始化,首先加载初始化父类,执行静态变量初始化(默认值为0),执行静态语句块
B静态语句块 b_int :200 2.父类加载初始化完成后,进行子类的加载初始化,执行静态变量初始化(设定值为200),执行静态语句块
A语句块 a_int :300 3.执行new B();。首先初始化父类变量,运行父类语句块,(变量初始化与语句块执行按代码先后顺序)然后运行父类构造方法。
A语句块 test :10
A构造器 a_int :300
A构造器 test :20
B语句块b_int :300 4.运行子类语句块,初始化子类变量,运行子类语句块,运行子类构造方法
B语句块 test :10
B构造器 b_int :300
B构造器 test :20