package org.hhb.objectinit; class Father { static { System.out.println("Father static block!"); } public Father() { System.out.println(this); System.out.println(((Sub) this).a); } } /** * * @author hehaibo * */ public class Sub extends Father { static { System.out.println("Sub static block!"); } public int a = 100; public Sub() { super(); System.out.println(this); System.out.println(a); a = 200; } public static void main(String[] args) { System.out.println(new Sub().a); } }
输出结果: 1 Father static block! 2 Sub static block! 3 Father this object::org.hhb.objectinit.Sub@19ee1ac 4 0 5 Sub this object::org.hhb.objectinit.Sub@19ee1ac 6 100 7 200
对象初始化的顺序:
1 为Sub对象分配内存空间,
初始化Sub对象的成员变量的默认值,而不是 a=100。
2 调用Father类的构造函数,并且初始化Father成员变量的默认值
3 调用Object类的构造函数,由jvm负责。
4 打印第3行的输出结果我们可以看出,当前父类的构造函数的this就是Sub对象的引用地址,
可以证明1是正确的。
5 第4行输出的值是0,我们可以看出Sub对象初始化的时候成员变量的默认值。
6 父类的构造函数调用完后,再次将Sub对象的a成员变量的默认初始值修改为100,所以第6行打印输出是100。
7 再次执行a=200,main方法中输出200
得出的结论是:构建子类对象的时候,所有的成员变量都是默认值,
而子类的成员变量的非默认值初始化[也就是a=100]是在父类执行完成后才执行的。
参考:http://kenwublog.com/a-interesting-problem-about-java-object-init-order
相关推荐
“礼让”原则学习Java对象初始化顺序
在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,网上关于Java中对象初始化顺序的文章很多,这篇文章我们将详细介绍Java中对象初始化顺序。有需要的可以参考学习。
本篇文章介绍了,Java对象初始化顺序的使用。需要的朋友参考下
以下这段小程序对调用对象构造函数时,父类构造函数、成员变量初始化函数,以及非静态初始化块调用顺序进行验证,不考虑静态成员及静态初始化块
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
java对象的初始化顺序[参考].pdf
本篇文章介绍了,Java对象初始化顺序的使用。需要的朋友参考下
本文对Java如何执行对象的初始化做一个详细深入地介绍。有需要的小伙伴们可以参考。
分析java对象初始化顺序,对于java初学者来说非常有用。
类的初始化顺序,适用于任何一种面向对象的语言。真正了解面向对象的程序的流程。配有实例
今天用了jmock对进行单元测试编码,发现一个比较奇怪的语法,static使用方法,见下面例子
如果为对象:这些对象会按顺序初始化。 ※在所有类成员初始化完成之后,才调用本类的构造方法创建对象。 构造方法的作用就是初始化。 (2) 静态对象的初始化 程序中主类的静态变量会在main方法执行前...
针对Java EE应用数据初始化时的先后顺序及依赖关系,提出一种基于设计模式的数据初始化方法.该方法首先将要初始化的数据看做一个复杂对象,通过建造者模式的产品角色来表示.利用抽象建造者角色定义数据初始化的先后...
java构造方法是java类中最重要的一个概念,这篇文档涵盖了,java对象初始化过程中构造器调用的顺序,及作用。
装载的时候,所有static对象和static代码块都会按照本来的顺序初始化(亦即它们在类定义代码里写入的顺序)。保证这个顺序是非常关键的,因为衍生类的初始化可
装载的时候,所有static对象和static代码块都会按照本来的顺序初始化(亦即它们在类定义代码里写入的顺序)。保证这个顺序是非常关键的,因为衍生类的初始化可
Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。...3、类初始化时,先初始化类的属性成员,在执行构造方法。
5.6.1 指定初始化 5.7 构造器初始化 5.7.1 初始化顺序 5.7.2. 静态数据的初始化 5.7.3. 显式的静态初始化 5.7.4. 非静态实例初始化 5.8 数组初始化 5.8.1 可变参数列表 5.9 枚举类型 5.10 总结 第6章 访问权限控制 ...
java程序在执行过程中,类,对象以及它们成员加载、初始化的顺序
类的初始化 成员初始化 构造器初始化初始化顺序 数组初始化 对象的销毁 对象作用域 this 和 super 访问控制权限继承 多态组合代理 向上转型static final 接口和抽象类接口 抽象类异常 认 识 Exception 什么是 ...