Flutter开发App的未来及其在各行业的应用潜力分析
832
2022-11-24
阿里巴巴难度系数五颗星的试题,小白竟然说很简单
牛客网上有道阿里巴巴的面试题,网站显示该题难度系数五颗星
原题
代码如下:
public class Base{ private String baseName = "base"; public Base(){ callName(); } public void callName(){ System. out. println(baseName); } static class Sub extends Base{ private String baseName = "sub"; public void callName(){ System. out. println (baseName) ; } } public static void main(String[] args){ Base b = new Sub(); }}
调试顺序
分析
我们知道一般的类加载顺序是:先静态变量,然后静态代码块,其次是成员变量和普通代码块,最后是构造函数
new Sub()先加载基类成员变量,baseName = "base",没问题
然后加载基类构造函数public Base(),,但是构造函数中调用了callName
关键就在这个callName,它在子类Sub中也存在
再仔细看一下main方法Base b = new Sub();
恰好满足多态的三个必要条件
1、 继承2、 子类重写父类方法3、 父类引用指向子类对象
所以在父类的构造函数中调用的callName实际会调用子类的callName,而此时子类中的成员变量baseName还未加载,没有被赋值,所以为null
此处 不仅仅考察了类的加载顺序,还考察了java多态的特性
验证
也就是说,父类的引用指向子类的对象时,调用共有方法,会执行子类方法,改造一下验证
public class Base { private String baseName = "base"; public Base() { callName(); } public void baseMethod(){ System. out. println("baseMethod"); } public void commonMethod(){ System. out. println("commonMethod for Base"); } public void callName() { System. out. println("Base callName(): "+baseName); } static class Sub extends Base { private String baseName = "sub"; public void subMethod(){ System. out. println("subMethod"); } public void commonMethod(){ System. out. println("commonMethod for Sub"); } public void callName() { System. out. println ("Sub callName(): "+baseName) ; } } public static void main(String[] args) { System. out. println("************父类引用指向子类的对象**************"); Base baseWithSub = new Sub(); baseWithSub.baseMethod(); baseWithSub.commonMethod(); System. out. println("***********父类引用指向自己的对象***************"); Base base = new Base();// base.baseMethod(); base.commonMethod(); System. out. println("##############子类引用指向子类的对象##################"); Sub sub = new Sub(); sub.subMethod(); sub.commonMethod(); }}
总结
总结一下就是 1、父类的引用指向子类的对象,通过父类的引用调用父类、子类中均有的方法,那么java会自动调用子类的方法 2、父类的引用指向父类的对象,调用的是自己的方法
3、子类引用指向子类的对象,在涉及父类方法调用时,比如调用父类构造函数、父类代码块涉及重写函数等参照第一条,调用子类的方法
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~