您的位置:首页 > 编程语言 > Java开发

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(),这个时候子类初始化块已经结束!!!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: