java类中的静态属性方法加载情况初探
Source.java中
1 /** 2 * 类的静态代码块在类第一次实例化或调用的情况下执行,且只执行一次 3 * 4 * @author admin 5 * 6 */ 7 class A{ 8 9 String a="hello"; 10 static { 11 System.out.println(B.b); 12 System.out.println("a类的加载"); 13 } 14 15 } 16 class A1{ 17 static{ 18 System.out.println("a1的加载"); 19 B b=new B(); 20 b.hello2(); 21 B.hello(); 22 } 23 public A1(){ 24 System.out.println("A1的构造方法"); 25 } 26 } 27 class B{ 28 static String b="你好"; 29 public static void hello(){ 30 System.out.println("b类的静态方法"); 31 } 32 static{ 33 System.out.println("b类的加载"); 34 } 35 public void hello2(){ 36 System.out.println("b类的实例方法"); 37 } 38 }
Test.java中
public static void main(String[] args) { A1 a1=new A1(); A a=new A(); B b = new B(); }
执行结果:
a1的加载
b类的加载
b类的实例方法
b类的静态方法
A1的构造方法
你好
a类的加载
行为分析:
实例化一个A1类对象,
静态代码块中调用了B类的静态方法,创建了B类的实例对象,且调用了B类的实例方法
实例化一个A类对象,
静态代码块中调用了B类的静态方法
实例化一个B类对象
分析结果
可以看出A1类的静态代码块在构造器之前执行了,且这时候调用了B的静态方法和实例方法
因此可以看出在类中静态代码块在构造器之前执行

分析:静态代码块可以调用在它后面的静态方法,但不能使用它后面的静态变量,理由是未定义,不能使用
但静态方法可以使用在它后面的静态变量
静态代码块可以使用在它之前定义的静态变量,但不能使用之后的,说明 静态变量和静态代码块的初始化顺序是在同一级别的(只按行号排序)
但静态代码块可以使用静态方法,是不是说明静态方法在静态代码块之前就加载完成。
但静态方法可以使用在他后面的静态变量,是不是说明静态方法在静态变量之后就加载完成呢?
这矛盾了,唯一的解释就是 先定义(静态方法和静态变量) 再初始化(静态变量和静态代码块),
本次测试结论
类中的方法变量语句块是 先定义,然后再进行初始化;
定义顺序:静态变量》静态方法
初始化顺序:静态变量=静态代码块>构造器

浙公网安备 33010602011771号