JAVA 对象创建过程
2015-08-05 14:21
197 查看
以前一直认为自己对JAVA创建对象的过程掌握的十分不错,最近同事小黄给我拿来一道面试题我竟然答错了,最近正好工作调整,不太忙,决定好好整理一下JAVA基础知识点。就从这道题开始。
public class Sub extends Super { int j = 30; Sub() { print(); j = 40; } void print() { System.out.println(j); } public static void main(String[] args) { System.out.println(new Sub().j); } } class Super { int i=10; Super() { print(); } void print() { System.out.println(i); } }
这道题的输出结果是什么呢?
问输出的结果:
0
30
40
为什么输出的是第一个为什么输出的是0呢?这个问题就要从JAVA创建对象的执行顺序说起!
我们将原来的程序改为下面的语句输出。
public class Sub extends Super{ static{ System.out.println("子类静态初始化块"); } { System.out.println("子类初始化块"); } public Sub() { System.out.println("调用了子类无参构造器"); } public static void main(String[] args) { Sub s=new Sub(); } } class Super{ static{ System.out.println("父类静态初始化块"); } { System.out.println("父类初始化块"); } public Super() { System.out.println("调用了父类无参构造器"); } }
打印的顺序就是java 代码创建对象时的顺序
**①父类静态初始化块
②子类静态初始化块
③父类初始化块
④调用了父类无参构造器
⑤子类初始化块
⑥调用了子类无参构造器**
注意4 5 是在调用父类构造器之后再调用的子类初始化块!!!
这就是说当调用子类构造的时候先调用父类初始化块 父类构造 然后调用子类初始化块 最后才是子类构造的内容
!!!
因为子类重写了父类的print方法,因此父类构造中调用的print(),应该是子类覆盖的版本,而在此时由于子类初始化块尚未被执行
因此输出j应该使用的是默认值0 而30的打印是子类构造中调用的print(),这个时候子类初始化块已经结束!!!
相关文章推荐
- 《Thinking in Java》——静态、非静态成员变量、子句的初始化顺序(含继承)及对象创建过程
- Java创建对象的过程简介
- Java内存区域模型、对象创建过程、常见OOM
- Java对象的创建过程
- [自学问题总结] java中的对象创建过程
- 深入理解java对象的创建过程:类的初始化和实例化
- Java对象的创建过程
- Java对象创建和初始化过程,处理字符串的机制
- 深入理解Java对象的创建过程:类的初始化与实例化
- java对象的创建过程
- Java:对象创建和初始化过程
- 帮你深入理解 JAVA 对象创建的过程
- java 对象创建的过程
- Java对象的创建过程
- JVM源码分析之Java对象的创建过程
- java中super的作用及子类对象的创建过程
- Java对象创建过程补遗
- Thinking in Java之对象的创建过程
- Java 对象的创建的过程
- java 创建对象的过程