黑马程序员技术交流社区

标题: 一个程序执行问题 [打印本页]

作者: j816326    时间: 2013-6-13 19:53
标题: 一个程序执行问题
下面这个程序是我在本论坛看的一个小程序,可我有点迷惑,在main方法调用new Demo()方法时Demo类到底加载了没有,如果加载了 为什么成员变量没有先加载? 如果没加载 那么怎么能调用Demo类的构造函数呢  ?求解释详细的
class X {
        X() {
                System.out.print("X");
        }
        Y b = new Y();
}

class Y {
        Y() {
                System.out.print("Y");
        }
}

class Demo extends X {
        Y y = new Y();

        Demo() {
                System.out.print("Z");
        }

        public static void main(String[] args) {

                new Demo();

        }

}

作者: 王靖远    时间: 2013-6-13 20:08
先加载父类构造代码块 再加载父类构造函数 再加载子类构造代码块 再加载子类构造函数。
作者: ying_1990    时间: 2013-6-13 21:45
我是这么理解的..
1.new Demo(); 首先调用其父类的构造方法,也就是class X
2.class x中再执行Y b = new Y();  接着打印"X",即输出为YX
3.执行完父类的构造方法,返回执行Y y = new Y(); 再输出一个Y
4.最后打印"Z"..

作者: j816326    时间: 2013-6-13 21:49
看清楚我的问题啊 我也知道程序的流程  就是疑惑在main方法调用new Demo()方法时Demo类到底加载了没有,如果加载了 为什么成员变量没有先加载? 如果没加载 那么怎么能调用Demo类的构造函数呢  
作者: 神之梦    时间: 2013-6-13 22:29
j816326 发表于 2013-6-13 21:49
看清楚我的问题啊 我也知道程序的流程  就是疑惑在main方法调用new Demo()方法时Demo类到底加载了没有,如 ...

楼主说的成员变量没有先加载指的是哪个成员变量?
作者: ying_1990    时间: 2013-6-13 22:34
先开始new Demo,因为是继承类,所以一切先从父类加载.
而父类中先加载成员变量.

这样能算解决问题了么..

作者: Super_Class    时间: 2013-6-13 22:36
继承是 is a  所属关系。

也就是在构造函数初始化中
Demo() {
//隐含了   super(); 这样一个语句。会自动调用父类的空参构造函数。
                System.out.print("Z");
        }
作者: j816326    时间: 2013-6-13 22:39
楼主说的成员变量没有先加载指的是哪个成员变量?

Demo类中的那个成员变量




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