java静态加载_java类中的静态属性方法加载情况初探

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

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

4f64f29235b1714b29c4eb284cb364f3.png

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

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

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

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

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

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

本次测试结论

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值