Java的<init>,<cinit>与类的初始化顺序
2016-09-19 22:29
513 查看
<init>
与<clinit>
<init>
Java在编译之后会在字节码文件中生成<init>方法,称之为实例构造器,该实例构造器会将语句块,变量初始化,调用父类的构造器等操作收敛到
<init>方法中,收敛顺序(这里只讨论非静态变量和语句块)为:
1. 父类变量初始化
2. 父类语句块
3. 父类构造函数
4. 子类变量初始化
5. 子类语句块
6. 子类构造函数
所谓收敛到
<init>方法中的意思就是,将这些操作放入到
<init>中去执行
<clinit>
Java在编译之后会在字节码文件中生成
<clinit>方法,称之为类构造器,类构造器同实例构造器一样,也会将静态语句块,静态变量初始化,收敛到
<clinit>方法中,收敛顺序为:
1. 父类静态变量初始化
2. 父类静态语句块
3. 子类静态变量初始化
4. 子类静态语句块
<clinit>方法是在类加载过程中执行的,而
<init>是在对象实例化执行的,所以
<clinit>一定比
<init>先执行。所以整个顺序就是:
1. 父类静态变量初始化
2. 父类静态语句块
3. 子类静态变量初始化
4. 子类静态语句块
5. 父类变量初始化
6. 父类语句块
7. 父类构造函数
8. 子类变量初始化
9. 子类语句块
10. 子类构造函数
初始化顺序
如下父类代码public class Parent { static int a = 1; int b = 1; static { System.out.println("parent static block(a):" + (++a)); } { System.out.println("parent block(b):" + (++b)); } public Parent() { System.out.println("parent construction"); } }
子类代码
public class Child extends Parent { static int a = 1; int b = 1; static { System.out.println("child static block(a):" + (++a)); } { System.out.println("child block(b):" + (++b)); } public Child() { System.out.println("child construction"); } public static void main(String[] args) { new Child(); } }
最终输出结果为
parent static block(a):2 child static block(a):2 parent block(b):2 parent construction child block(b):2 child construction
相关文章推荐
- 从类文件分析Java类装载过程<clinit>方法的调用和<init>的调用
- web.xml的初始化参数:<context-param>与<init-param>的区别
- web.config中验证的<deny users = "?"/>和<allow users= "*" />有先后顺序只说
- web.xml的配置中<context-param>与<init-param>配置作用
- [ERROR] [2012-59-30 05:59:28] org.hibernate.AssertionFailure.<init>(AssertionFailure.java:45) -an a
- java.lang.NoSuchMethodException:构造函数<init>失败
- web.xml之<context-param>与<init-param>的区别与作用
- java.lang.NoSuchMethodError: org.hibernate.mapping.SimpleValue.<init>(Lorg/hibernate/mapping/Table;)V
- <context-param>与<init-param>备忘
- <<Think in Java 4 >>中关于使用XOM操作xml文件
- spring整合jbpm Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z)V
- <context-param>与<init-param>的区别与作用
- Hadoop 学习笔记:java.lang.NoSuchMethodException: DataJoin$TaggedWritable.<init>()
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V
- java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.<init>(L
- asp.net页面从初始化到卸载事件顺序<转>
- java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(Z
- <context-param>与<init-param>的区别与作用
- <context-param>与<init-param>的区别与作用
- [j2ee][servlet]<context-param>与<init-param>的区别与作用