Java代码
1.class A {
2. int i = 10;
3. static {
4. System.out.print("1");
5. }
6.
7. public A() {
8. System.out.print("2");
9. }
10.
11.
12.}
13.
14.class B extends A {
15. int i = 20;
16. static {
17. System.out.print("a");
18. }
19.
20. public B() {
21. System.out.print("b");
22. }
23.
24.
25.}
26.
27.public class Heloo {
28. public static void main(String[] arge) {
29. System.out.println(" ");
30. A ab = new B();
31. System.out.println(" ");
32. ab = new B();
33. }
34.}
结果是:
1a2b
2b
原因:
这个是类的初始化顺序问题
1、类只有在使用New调用创建的时候才会被JAVA类装载器装入
2、JAVA类首次装入时,会对静态成员变量或方法进行一次初始化,但方法不被调用是不会执行的,静态成员变量和静态初始化块级别相同,非静态成员变量和非静态初始化块级别相同。
先初始化父类的静态代码--->初始化子类的静态代码-->
初始化父类的非静态代码--->初始化父类构造函数--->
初始化子类非静态代码--->初始化子类构造函数
3、创建类实例时,首先按照父子继承关系进行初始化
4、类实例创建时候,首先初始化块部分先执行,然后是构造方法;然后从
本类继承的子类的初始化块执行,最后是子类的构造方法
上例中类A类B都有静态代码static
|