阿里巴巴难度系数五颗星的试题,小白竟然说很简单

网友投稿 794 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小时内删除侵权内容。

上一篇:5个零售商IoT使用案例,零售商终于接近物联网
下一篇:Envoy和类似的系统比较
相关文章

 发表评论

暂时没有评论,来抢沙发吧~