首页 > 学院 > 开发设计 > 正文

例题:子类重写父类方法后的调用规则

2019-11-08 01:27:53
字体:
来源:转载
供稿:网友

例题:

(单选题) 下面代码的输出是什么?
1234567891011121314151617181920212223242526publicclass Base{    PRivateString baseName = "base";    publicBase()    {        callName();    }     publicvoid callName()    {        System. out. println(baseName);    }     staticclass Sub extendsBase    {        privateString baseName = "sub";        publicvoid callName()        {            System. out. println (baseName) ;        }    }    publicstatic void main(String[] args)    {        Base b = newSub();    }}
A.null

B.sub

C.base

答案:C

先成员变量再构造方法,先父类再子类多态表现:有同名方法执行子类的

new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null执行 Base b = new Sub();时由于多态 b编译时表现为Base类特性,运行时表现为Sub类特性,Base b = new Sub();不管是哪种状态都会调用Base构造器执行 callName()方法;执行方法时,由于多态表现为子类特性,所以会先在子类是否有 callName();而此时子类尚未初始化(执行完父类构造器后才会开始执行子类),如果有 就 执行,没有再去父类寻找


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表