java类初始化顺序

java

http://www.cnblogs.com/wenruo/articles/5349525.html

先不考虑父类。

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

例如

 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()

然后考虑下父类。

当子类的静态域被初始化时候,那一定要先初始化父类的静态域。

当创建子类对象时,要先初始化静态域(如果之前未初始化),先是父类然后子类。之后初始化父类的非静态域和父类构造器,然后是子类。

例(新手起名废求破):

 1 class XD {

2 XD(int maker) {

3 System.out.println("XD(" + maker +")");

4 }

5 }

6

7 class Father {

8 Father() {

9 System.out.println("Father()");

10 }

11 static XD xd = new XD(1);

12 XD xd1 = new XD(2);

13 }

14

15 class Son extends Father {

16 Son() {

17 System.out.println("Son()");

18 }

19 static XD xd = new XD(3);

20 XD xd1 = new XD(4);

21 static void f() { System.out.println("f()"); }

22 }

23

24

25 public class InitializeWithExtends {

26 public static void main(String[] args) {

27 new Son();

28 System.out.println();

29 new Son();

30 }

31 }

输出

XD(1)

XD(3)

XD(2)

Father()

XD(4)

Son()

XD(2)

Father()

XD(4)

Son()

以上是 java类初始化顺序 的全部内容, 来源链接: utcz.com/z/394141.html

回到顶部