Source.java中
1 /**
2 * 类的静态代码块在类第一次实例化或调用的情况下执行,且只执行一次3 *4 *@authoradmin5 *6 */
7 classA{8
9 String a="hello";10 static{11 System.out.println(B.b);12 System.out.println("a类的加载");13 }14
15 }16 classA1{17 static{18 System.out.println("a1的加载");19 B b=newB();20 b.hello2();21 B.hello();22 }23 publicA1(){24 System.out.println("A1的构造方法");25 }26 }27 classB{28 static String b="你好";29 public static voidhello(){30 System.out.println("b类的静态方法");31 }32 static{33 System.out.println("b类的加载");34 }35 public voidhello2(){36 System.out.println("b类的实例方法");37 }38 }
Test.java中
public static voidmain(String[] args) {
A1 a1=newA1();
A a=newA();
B b= newB();
}
执行结果:
a1的加载
b类的加载
b类的实例方法
b类的静态方法
A1的构造方法
你好
a类的加载
行为分析:
实例化一个A1类对象,
静态代码块中调用了B类的静态方法,创建了B类的实例对象,且调用了B类的实例方法
实例化一个A类对象,
静态代码块中调用了B类的静态方法
实例化一个B类对象
分析结果
可以看出A1类的静态代码块在构造器之前执行了,且这时候调用了B的静态方法和实例方法
因此可以看出在类中静态代码块在构造器之前执行
分析:静态代码块可以调用在它后面的静态方法,但不能使用它后面的静态变量,理由是未定义,不能使用
但静态方法可以使用在它后面的静态变量
静态代码块可以使用在它之前定义的静态变量,但不能使用之后的,说明 静态变量和静态代码块的初始化顺序是在同一级别的(只按行号排序)
但静态代码块可以使用静态方法,是不是说明静态方法在静态代码块之前就加载完成。
但静态方法可以使用在他后面的静态变量,是不是说明静态方法在静态变量之后就加载完成呢?
这矛盾了,唯一的解释就是 先定义(静态方法和静态变量) 再初始化(静态变量和静态代码块),
本次测试结论
类中的方法变量语句块是 先定义,然后再进行初始化;
定义顺序:静态变量》静态方法
初始化顺序:静态变量=静态代码块>构造器