java类初始化顺序及过程
来源:互联网 发布:电音软件 编辑:程序博客网 时间:2024/06/14 16:30
当一个类被首次使用时,它会执行初始化,为类变量赋予初始值,这里所说首次使用包括:
2、执行子类的静态代码块和静态变量初始化。
3、执行父类的非静态变量初始化
4、执行父类的构造函数
5、执行子类的非静态变量初始化
- 创建类的实例
- 初始化某个类的子类
- 调用类的静态成员或方法
- 含有main()方法的类启动
- 调用反射方法
可结合如下例子说明:
class Bowl {Bowl(int marker) {System.out.println("Bowl(" + marker + ")");}void f(int marker) {System.out.println("f(" + marker + ")");}}class Table {static Bowl b1 = new Bowl(1);Table() {System.out.println("Table()");b2.f(1);}void f2(int marker) {System.out.println("f2(" + marker + ")");}static Bowl b2 = new Bowl(2);}class Cupboard {Bowl b3 = new Bowl(3);static Bowl b4 = new Bowl(4);Cupboard() {System.out.println("Cupboard()");b4.f(2);}void f3(int marker) {System.out.println("f3(" + marker + ")");}static Bowl b5 = new Bowl(5);}public class StaticInitialization {public static void main(String[] args) {System.out.println("Creating new Cupboard() in main");new Cupboard();System.out.println("Creating new Cupboard() in main");new Cupboard();t2.f2(1);t3.f3(1);}static Table t2 = new Table();static Cupboard t3 = new Cupboard();} ///:
运行结果如下:首先是主方法调用,会进行StaticInitialization类的初始化,其中static的类成员会被优先初始化,因此t2会执行初始化,可看到table类中存在静态字段b1,由于静态成员会优先构造方法执行,故b1进行初始化,直接调用构造方法,输出Bowl(1)。静态成员b1之后还有静态成员b2,因此输出Bowl(2),成员赋值完毕后会执行构造方法,输出Table()和f(1).以此类推,又回到StaticInitialization类,开始初始化t3,先为类成员赋值,同理,static的类成员会优先被初始化,因此输出Bowl(4)和Bowl(5),之后初始化非静态成员,输出Bowl(3),之后调用构造方法输出Cupboard()和f(2).最后在进入main方法执行,可根据之前的规则类推,可能有些同学会有些疑问,为什么main方法里面new Cupboard()的时候只初始化了b3?这是因为b4和b5都是静态字段,只会执行一次初始化。
总结:
1、先执行父类的静态代码块和静态变量初始化,静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。2、执行子类的静态代码块和静态变量初始化。
3、执行父类的非静态变量初始化
4、执行父类的构造函数
5、执行子类的非静态变量初始化
6、执行子类的构造函数
7、静态字段只会被初始化一次
0 0
- java类初始化顺序及过程
- Java 类和对象的初始化过程及初始化顺序
- Java 类和对象的初始化过程及初始化顺序
- java对象创建过程及初始化顺序
- Java类创建过程与初始化顺序
- java学习心得(二):对象的初始化顺序及过程
- Java类及对象初始化的顺序
- java 类及子类的初始化顺序
- Java类的加载及初始化顺序
- Java类加载及初始化顺序
- java类的初始化顺序及继承顺序
- java 继承 及 初始化顺序
- static 及java初始化顺序
- java 初始化及执行顺序
- java类的加载及初始化过程
- Java类加载及变量初始化过程
- Java类加载及变量初始化过程
- JAVA 类初始化顺序
- (POJ3007)Organize Your Train part II <reverse函数/ hash / STL>
- jquery的宽高
- dealloc
- 深度学习的应用——快速变脸的实现
- 如何将表单中的值在Jquery中转为json
- java类初始化顺序及过程
- liferay中api的查看
- Python之pickle标准模块
- 注册机使用原理及实现
- 高并发的根据资源ID上锁
- 关于LBP(Local Binary Pattern)特征<二> 几种变种
- ConcurrentHashMap深入分析
- python的pip问题
- 关于Strict Mode