黑马程序员技术交流社区

标题: 求大神解释 [打印本页]

作者: 朱朱生    时间: 2015-8-15 16:39
标题: 求大神解释
class Fu
{
        int num = 8;
        {
                System.out.println("fu");
        }
        public Fu(){
                super();
                show();
        }
        public void show(){
                System.out.println("fu show"+num);
        }
}
class Zi extends Fu
{
        int num = 10;
        {
                System.out.println("zi");
        }
        public Zi(){
                super();
                show();
        }
        public void show(){
                System.out.println("zi show"+num);
        }
}
class ExtendsDemo5
{
        public static void main(String[] args){
                new Zi();
        }
}


输出结果是
fu
zi show0
zi
zi show 10
我没明白zi show0是为什么,为什么不是10?或者8?


作者: zhao1991    时间: 2015-8-15 16:58
在创建对象时,该对象所属的构造器会被调用。子类的构造器在被调用之前会先调用基类的构造器,不管是否在子类的构造器中显式
作者: zhao1991    时间: 2015-8-15 17:05
调用父类的构造器还是隐式调用父类的构造器,以确保类构成的完整性;又因为多态的存在,在父类的构造器中调用已被子类覆盖的方法时,真正被调用的是子类中的方法,又因为在此时子类的成员还没有被初始化,其默认值还是0,所以不是8或10。(对象刚被创建时其成员变量的值被初始化为0)
作者: sven556677    时间: 2015-8-15 17:07
好像是个蛮有意思的例子,mark了,我是这样理解:那个num=0结果就是说这个成员变量还没有初始化喽,这时候整个构造函数还在跑的过程中,里面的成员就还没初始化完成。




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