黑马程序员技术交流社区

标题: 关于子类继承父类访问先后顺序,求详解(前提是你真懂) [打印本页]

作者: 乔玉吉    时间: 2012-6-27 17:44
标题: 关于子类继承父类访问先后顺序,求详解(前提是你真懂)
运行以下代码片段,输出结果是?(  )
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();
        }
}

作者: 车风波    时间: 2012-6-27 18:11
类中:先成员变量默认初始化,然后执行构造方法,最后成员变量显式初始化。
首先你运行Z,在此类中先显式初始化y  Y y = new Y();然后执行main().
main()中执行的new Z();会先执行父类的构造函数
X() {
         System.out.print("X");
         }
,然后显式初始化父类的成员变量Y b = new Y();
最后执行子类的构造函数
Z() {
      System.out.print("Z");
        }
作者: 晁喆    时间: 2012-6-27 18:19
本帖最后由 晁喆 于 2012-6-27 18:35 编辑

首先访问main函数,new Z()的意思是:创建子类对象的时候, 内部会先创建一个父类对象,所以先执行class x{}中的代码,输出YX,再回来执行继承的代码,输出YZ。
结果应该是:YXYZ
作者: 马林康    时间: 2012-6-27 18:31
对象初始化顺序:父类静态成员变量<父类静态初始化块<子类静态成员变量<子类静态初始化块<父类变量<父类初始化块<父类构造器<子类变量<子类初始化块<子类构造器 结果为YXYZ
作者: 李伟    时间: 2012-6-27 18:56
new Z();是先对父类X进行初始化,然后Z再初始化,父类X初始化之后是YX,  Z初始化之后是YZ,所以结果是YXYZ
作者: 孙飞    时间: 2012-6-27 21:24
class X {
        Y b = new Y();
        X() {
                        System.out.print("X");
        }
}

是先执行Y b = new Y();
还是先执行构造函数?
那个Y b = new Y();不是一个显式初始化吗?

作者: 王德升    时间: 2012-6-27 21:54
feigecal 发表于 2012-6-27 21:24
class X {
        Y b = new Y();
        X() {

先执行x(){},在给对象初始化。




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