例题:
(单选题) 下面代码的输出是什么?| 1234567891011121314151617181920212223242526 | publicclass 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(); }} |
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();而此时子类尚未初始化(执行完父类构造器后才会开始执行子类),如果有 就 执行,没有再去父类寻找新闻热点
疑难解答