A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


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

评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1 多总结,理解更透彻

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马