黑马程序员技术交流社区

标题: 关于JAVA执行顺序问题,请教大家 [打印本页]

作者: 朱平    时间: 2013-4-10 11:42
标题: 关于JAVA执行顺序问题,请教大家
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时进入到了别的类去了看不懂
新人请大家帮一下忙,谢谢了!

作者: 王怀亮    时间: 2013-4-10 13:25
new Z()的时候,是进入了X这个父类中,但是一旦进入了X这个父类中就要按照顺序执行了,因为程序先遇到的Y b = new Y();,这时程序就跳转进入了Y中,执行完这句代码后才遇到的X的构造方法,这时候才执行X的构造方法,就像刚进入Z时,为什么不先执行Z的构造方法呢,是一样的道理
作者: CrazyProgram    时间: 2013-4-10 13:31
可以用debug的方式自己查看下,很清晰的。。
new Z()的时候,先调用父类的也就是x的方法,打印出YX。。。然后在调用Z里面自己的方法打印出YZ。。
所以是YXYZ
作者: lyg2013    时间: 2013-4-10 14:48
本帖最后由 lyg2013 于 2013-4-10 19:11 编辑

在每一个能执行的代码下面添加System.out.pritnln("具体第几句");就知道怎么执行了。你可以看看这个博客
http://blog.csdn.net/liushuigen11/article/details/8774953
作者: 朱平    时间: 2013-4-10 19:30
王怀亮 发表于 2013-4-10 13:25
new Z()的时候,是进入了X这个父类中,但是一旦进入了X这个父类中就要按照顺序执行了,因为程序先遇到的Y b ...

谢谢啊 我是新手,我原以为是new z()的时候 会直接调用父类的构造函数,不会运行其他的,也没有会想到会进入X类中按顺序执行,打印完YX后,接着就进入Z本类了吧,又执行Y y=new Y()打印Y去了然后再去执行Z的构造
作者: 李罡    时间: 2013-4-10 20:24
程序在执行过程中,当运行完该类的构造函数中的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
作者: lcjasas    时间: 2013-4-10 21:05
本帖最后由 lcjasas 于 2013-4-10 21:09 编辑



5,7,10,12所以输出结果YXYZ
献丑了。。。有不对的地方提醒下。
作者: 朱平    时间: 2013-4-11 18:02
李罡 发表于 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
本帖最后由 李罡 于 2013-4-11 19:41 编辑

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

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2