java类初始化顺序

先不考虑父类。

当创建类对象时,先初始化静态变量和静态块,然后是非静态变量和非静态代码块,然后是构造器。由于静态成员只会被初始化一次,所以如果静态成员已经被初始化过,将不会被再次初始化。

1 class A {
 2     A(int maker) {
 3         System.out.println("A(" + maker + ")");
 4     }
 5 }
 6 
 7 class Test {
 8     static A a1 = new A(1);
 9     A a2 = new A(2);
10     {
11         System.out.println("非静态的代码块"); 
12     }
13     A a3 = new A(3);
14     static {
15         System.out.println("静态块");
16         A a4 = new A(4);
17     }
18     static void f() {System.out.println("f()");}
19     Test() {
20         System.out.println("Test()");
21     }
22     static A a5 = new A(5);
23 }
24 
25 public class Initialize {
26     public static void main(String[] args) {
27         new Test();
28         System.out.println();
29         new Test();
30     }
31 }



 

输出:
A(1)
静态块
A(4)
A(5)
A(2)
非静态的代码块
A(3)
Test()

A(2)
非静态的代码块
A(3)
Test()

对于静态成员,不仅是初始化对象时才会初始化,当第一次引用静态变量或者静态函数时都会使静态成员初始化。

 1 class A {
 2     A(int maker) {
 3         System.out.println("A(" + maker + ")");
 4     }
 5 }
 6 
 7 class Test {
 8     static A a1 = new A(1);
 9     A a2 = new A(2);
10     {
11         System.out.println("非静态的代码块"); 
12     }
13     A a3 = new A(3);
14     static {
15         System.out.println("静态块");
16         A a4 = new A(4);
17     }
18     static void f() {System.out.println("f()");}
19     Test() {
20         System.out.println("Test()");
21     }
22     static A a5 = new A(5);
23 }
24 
25 public class Initialize {
26     public static void main(String[] args) {
27         Test.f();
28         System.out.println();
29         new Test();
30     }
31 }
这次将输出:
A(1)
静态块
A(4)
A(5)
f()

A(2)
非静态的代码块
A(3)
Test()

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值