JAVA 对象创建过程

以前一直认为自己对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(),这个时候子类初始化块已经结束!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值