A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 朱朱生 中级黑马   /  2015-8-15 16:39  /  701 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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?

3 个回复

倒序浏览
在创建对象时,该对象所属的构造器会被调用。子类的构造器在被调用之前会先调用基类的构造器,不管是否在子类的构造器中显式
回复 使用道具 举报
调用父类的构造器还是隐式调用父类的构造器,以确保类构成的完整性;又因为多态的存在,在父类的构造器中调用已被子类覆盖的方法时,真正被调用的是子类中的方法,又因为在此时子类的成员还没有被初始化,其默认值还是0,所以不是8或10。(对象刚被创建时其成员变量的值被初始化为0)
回复 使用道具 举报 1 0
好像是个蛮有意思的例子,mark了,我是这样理解:那个num=0结果就是说这个成员变量还没有初始化喽,这时候整个构造函数还在跑的过程中,里面的成员就还没初始化完成。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马