黑马程序员技术交流社区

标题: 构造方法 [打印本页]

作者: 王贵朝    时间: 2012-9-25 18:55
标题: 构造方法

class X {         //main中z对父类x的构造方法调用,运行的是 Y b = new y();还是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-9-25 19:26
实在看不懂哥们的问题!你是问你的程序的结果还是问什么啊 !写程序最好不要这样XYZ的(个人觉得)!希望哥们再说明下题意啊!
作者: 杨卫腾    时间: 2012-9-25 19:29
输出的是: Y X Y Z

当在Z的主类中运行主函数的时候,执行到new Z();  的时候会到X类中进行初始化
当进入到X类中的时候,读取到   Y b = new Y();   创建Y 的对象,又进入到Y类的构造函数中进行初始化,
会打印出 Y;

下来就会继续初始化 X 类,进入构造函数,打印的是 X;
下来再到自己的类(Z)中初始化,  得到的结果是 Y 、Z;


作者: 王得新    时间: 2012-9-25 20:21
本帖最后由 王得新 于 2012-9-25 20:24 编辑

在这里先说点小知识,main()方法在一个类中(本例是在Z类中),但不代表main()方法就是属于这个类。(楼主可以把main()函数很果断的剪切到同一个包下的X或Y中试下)

看重点:
class X {         //main中z对父类x的构造方法调用,运行的是 Y b = new y();还是X()??

    Y b = new Y();         //2.   这里是重点,应该听说过这样一句话,先静态后动态,先成员后构造,所以这里,先是 Y b = new Y(),再是X()构造函数

    X() {                //4.   然后这才是第2步中X()构造函数。所以输出----------------------------------->X

            System.out.print("X");

    }

}

class Y {

    Y() {//3.由于第2步的原因,所以这里第3步输出------------------------------------->Y
            //6.由于第5步Y b = new Y()的原因,所以这里输出-------------------------------->Y

            System.out.print("Y");

    }

}


public class Z extends X {

    Y y = new Y();            //5.    第4步完了之后,就到Z类中了,这里还是先成员后构造,所以先是Y b = new Y(),再是Z();

    Z() {            //7.    最后一步是new Z(),所以最后输出------------------------------>Z

            System.out.print("Z");

    }


    public static void main(String[] args) {        //main函数是入口不用说的

           new Z();       //1.   调用Z类在构造函数,但是Z是继承X的,所以先到X类中

    }

}



所以结果是   Y  X  Y  Z

作者: 彭旭文    时间: 2012-9-26 01:27
学习了...
作者: 王小闲7    时间: 2012-9-26 11:10
以前我学习的时候只知道子类的构造方法中第一句要先写父类的构造方法,没想到连成员变量都加载了。总之又学到东西了。




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