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的静态方法和实例方法

  因此可以看出在类中静态代码块在构造器之前执行

 

 分析:静态代码块可以调用在它后面的静态方法,但不能使用它后面的静态变量,理由是未定义,不能使用

   但静态方法可以使用在它后面的静态变量

静态代码块可以使用在它之前定义的静态变量,但不能使用之后的,说明  静态变量和静态代码块的初始化顺序是在同一级别的(只按行号排序)

但静态代码块可以使用静态方法,是不是说明静态方法在静态代码块之前就加载完成。

但静态方法可以使用在他后面的静态变量,是不是说明静态方法在静态变量之后就加载完成呢?

 这矛盾了,唯一的解释就是 先定义(静态方法和静态变量)  再初始化(静态变量和静态代码块),

本次测试结论

  类中的方法变量语句块是 先定义,然后再进行初始化;

  定义顺序:静态变量》静态方法

  初始化顺序:静态变量=静态代码块>构造器

posted @ 2017-08-27 17:59  _zjyc  阅读(536)  评论(0)    收藏  举报