A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

朱平

初级黑马

  • 黑马币:1

  • 帖子:10

  • 精华:0

© 朱平 初级黑马   /  2013-4-10 11:42  /  1576 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class X {
    Y b = new Y();
    X() {
            System.out.print("X");
    }
}
class Y {
    Y() {
            System.out.print("Y");
    }
}
public class Z extends X {
    Y y = new Y();
    Z() {
            System.out.print("Z");
    }
    public static void main(String[] args) {
           new Z();
    }
}
打印的结果为YXYZ,想知道JAVA的执行顺序,new Z()的时候,是进入了X这个父类中吗,怎么不是先执行父类的构造方法,还有这整个程序的执行顺序,用myeclipse debug时进入到了别的类去了看不懂
新人请大家帮一下忙,谢谢了!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

8 个回复

倒序浏览
new Z()的时候,是进入了X这个父类中,但是一旦进入了X这个父类中就要按照顺序执行了,因为程序先遇到的Y b = new Y();,这时程序就跳转进入了Y中,执行完这句代码后才遇到的X的构造方法,这时候才执行X的构造方法,就像刚进入Z时,为什么不先执行Z的构造方法呢,是一样的道理

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
可以用debug的方式自己查看下,很清晰的。。
new Z()的时候,先调用父类的也就是x的方法,打印出YX。。。然后在调用Z里面自己的方法打印出YZ。。
所以是YXYZ

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 lyg2013 于 2013-4-10 19:11 编辑

在每一个能执行的代码下面添加System.out.pritnln("具体第几句");就知道怎么执行了。你可以看看这个博客
http://blog.csdn.net/liushuigen11/article/details/8774953

点评

博客的地址忘了贴么。。。  发表于 2013-4-10 18:12

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 呵呵~

查看全部评分

回复 使用道具 举报
王怀亮 发表于 2013-4-10 13:25
new Z()的时候,是进入了X这个父类中,但是一旦进入了X这个父类中就要按照顺序执行了,因为程序先遇到的Y b ...

谢谢啊 我是新手,我原以为是new z()的时候 会直接调用父类的构造函数,不会运行其他的,也没有会想到会进入X类中按顺序执行,打印完YX后,接着就进入Z本类了吧,又执行Y y=new Y()打印Y去了然后再去执行Z的构造
回复 使用道具 举报
程序在执行过程中,当运行完该类的构造函数中的super(或者this,如果构造函数中没有this或者super语句时默认第一句为super语句)语句时,就要给该类的成员变量进行赋值,即初始化,初始化完了以后再执行构造函数里面的其它内容。
执行new Z()语句时,先执行里面的super语句,所以执行X()里面的内容X()里面默认的第一句为super(),它的父类为Object,执行完以后给该类的成员变量初始化,即执行new Y()语句,打印出Y,然后执行X()里面其它内容,即打印出X。X()执行完以后,再回到子类Z中,因为Z中的super()语句执行完了,所以先给变量初始化,打印出Y,然后执行Z()中的其它内容,打印出Z。所以打印结果为YXYZ

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 lcjasas 于 2013-4-10 21:09 编辑



5,7,10,12所以输出结果YXYZ
献丑了。。。有不对的地方提醒下。

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
朱平 初级黑马 2013-4-11 18:02:04
8#
李罡 发表于 2013-4-10 20:24
程序在执行过程中,当运行完该类的构造函数中的super(或者this,如果构造函数中没有this或者super语句时默 ...

你好,是不是new Z()到了class X然后再去调用一个默认的super()既object,当object执行完以后,就回到classX这个类,Y b=new Y();当作x的一个成员变量,先初始化变量,然后才去执行构造X(),在初始化变量new Y()时进入到Y类中,然后又是先有一个看不见的super()到Object类中去了,当object执行完以后,就执行了Y()这个构造方法,然后去执行class X类中的X()构造打印出X,然后回到了Z这个类中重复上面的步骤打印出Y,最后执行到z()这个构造打印出Z,我这样理解对吗
回复 使用道具 举报
李罡 中级黑马 2013-4-11 19:39:14
9#
本帖最后由 李罡 于 2013-4-11 19:41 编辑

对,就是这么理解的!只要把该类构造方法中的super()语句执行完了以后就会给该类中的所有成员变量初始化!如果该类中还有一个变量private int a=8;那么这时也会给该a赋值为8!

其实更加完整的执行顺序是:
父类静态代码块-->子类静态代码块--->子类构造函数中的this和super语句(注意只先执行this或super)--->给该构造函数所在的类的非静态变量赋值(注意是非静态变量!)--->执行该类的构造代码块---->执行该构造函数其余的内容。
因为在这个程序中没有静态代码块和构造代码块,所以我上面就只写了那一部分。按照相同的思路去理解即可。把这个理顺了以后做那些里面有静态代码块,构造代码块,构造函数的题目就没有什么难度了~~~可以慢慢理解~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马