Java对象的初始化
1、以下内容转自知乎某大神:
对象在class文件加载完毕,以及为各成员在方法区开辟好内存空间之后,就开始所谓的“初始化”。
步骤:
- 基类静态代码块、基类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,并且只有在第一次加载类时执行)
- 派生类静态代码块、派生类静态成员字段(并列优先级,按照代码中出现的先后顺序执行,并且只有在第一次加载类时执行)
- 基类普通代码块、基类普通成员字段(并列优先级,按照代码中出现的先后顺序执行)
- 基类的构造函数
- 派生类普通代码块、派生类普通成员字段(并列优先级,按照代码中出现的先后顺序执行)
- 派生类的构造函数
注意:第1、2步的静态过程,只有在这个类第一次被加载时才运行。关于静态代码块和静态成员字段在普通代码块和普通成员字段之前,因为静态属于类,普通代码块和成员字段输入类的对象。先有的类,才有的类的实例对象。
2、init和clinit的区别
- init是对象构造器的方法,也就是程序在new一个对象调用该对象所属类的constructor方法时才执行,而clinit是类构造器方法的方法,也就是JVM进行类加载——验证——解析——初始化中的初始化阶段,JVM会调用clinit方法。
- init是instance实例构造器,对非静态变量初始化,而clinit是class类构造器对静态变量/静态代码块进行初始化。
Java中new一个对象的过程中发生了什么?
这里有一个很好的博客:大致分为类加载(加载阶段和初始化阶段)和创建对象。
作者:Ryanjie
出处:http://www.cnblogs.com/ryanjan/
本文版权归作者和博客园所有,欢迎转载。转载请在留言板处留言给我,且在文章标明原文链接,谢谢!
如果您觉得本篇博文对您有所收获,觉得我还算用心,请点击右下角的 [推荐],谢谢!