牛客网上有道阿里巴巴的面试题,网站显示该题难度系数五颗星

原题

代码如下:

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();}
}

咋一看,好像是考察类的加载顺序,应该会先加载Sub类,所以会输出sub
也有人表示不服,虽然会先从Sub类开始加载,但根据加载顺序,会先加载父类的构造函数
所以结果会输出base
——————————————————————————————————
但答案是null~

调试顺序

分析

我们知道一般的类加载顺序是:先静态变量,然后静态代码块,其次是成员变量和普通代码块,最后是构造函数

new Sub()先加载基类成员变量,baseName = "base",没问题

然后加载基类构造函数public Base(),,但是构造函数中调用了callName

关键就在这个callName,它在子类Sub中也存在

再仔细看一下main方法Base b = new Sub();

恰好满足多态的三个必要条件

1、 继承2、 子类重写父类方法3、 父类引用指向子类对象

所以在父类的构造函数中调用的callName实际会调用子类的callName,而此时子类中的成员变量baseName还未加载,没有被赋值,所以为null

此处 不仅仅考察了类的加载顺序,还考察了java多态的特性

ON java 8这本书中第九章给出了相关解释


后期绑定——多态

验证

也就是说,父类的引用指向子类的对象时,调用共有方法,会执行子类方法,改造一下验证

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、子类引用指向子类的对象,在涉及父类方法调用时,比如调用父类构造函数、父类代码块涉及重写函数等参照第一条,调用子类的方法

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

  1. sql优化的15个小技巧(必知五颗星),面试说出七八个就有了

    目录 前言 1 避免使用select * 2 用union all代替union 3 小表驱动大表 4 批量操作 5 多用limit 6 in中值太多 7 增量查询 8 高效的分页 9 用连接查询代替 ...

  2. 索引失效的10种场景,你知道几个呢?(必知五颗星)

    目录 前言 1. 准备工作 1.1 创建user表 1.2 插入数据 1.3 查看数据库版本 1.4 查看执行计划 2. 不满足最左匹配原则 2.1 哪些情况索引有效? 2.2 哪些情况索引失效? 3 ...

  3. 打印5列五颗星_王者荣耀段位排列每个段位多少星?段位排列标志多久刷新一次?[多图]...

    王者荣耀段位排列有很多个不同的段位,那么这些段位中每个段位是多少星?玩家们比较在乎段位的问题,那么今天游戏鸟小编就带着大家一起来了解段位排列的情况,另外下面还会有段位排列标志的刷新时间介绍哦! 王者荣 ...

  4. 打印5列五颗星_王者荣耀段位排列每个段位多少星?段位排列标志多久刷新一次?...

    王者荣耀段位排列有很多个不同的段位,那么这些段位中每个段位是多少星?玩家们比较在乎段位的问题,那么今天游戏鸟小编就带着大家一起来了解段位排列的情况,另外下面还会有段位排列标志的刷新时间介绍哦! 王者荣 ...

  5. 某销售公司在年末的时候会向员工发放红包,发放的红包金额共有5种,获取的条件各不相同:   1) 五颗星红包,每人8000元,平均月绩效大于80件商品(>80),并且在本年度满勤; 2) 四颗星红包,每

    某销售公司在年末的时候会向员工发放红包,发放的红包金额共有5种,获取的条件各不相同: 五颗星红包,每人8000元,平均月绩效大于80件商品(>80),并且在本年度满勤: 四颗星红包,每人4000 ...

  6. jar包是什么意思_面试难度五颗星:JVM有Full GC,为什么还会 OutOfMemoryError?

    点击上方蓝色"后端面试那些事儿",选择"设为星标" 学最好的别人,做最好的我们 来源:R 大 zhihu.com/question/38511221 问题: R ...

  7. UC浏览器主界面滑动折叠效果 使用自定义behavior实现 难度五颗星*****

    思路:!!!!!!!!!!! RcycleView上的HeadScrollBehavior 思路: 1.让recycleview居于头部的下方 ---方案: 重写layoutDependsOn  让当 ...

  8. 题目: 打印输出上下左右对称的,第一行一颗星,第二行三颗星,第三行五颗星,第四行七颗星,第五行五颗星,第六行三颗星,第七行一颗星

    题目: 打印输出 *        ***       *****      *******       *****        ***         * /* 分析: 前4行,行数1 2 3 4 ...

  9. 打印5列五颗星_13个Excel快捷打印技巧,让你熟练掌握打印机操作

    对于许多朋友来说,用Excel打印文件仍然是一个头条的问题,文件如何在表格中进行打印设置许多朋友还是比较陌生.今天我们就通过13个打印小技巧,让大家了解一下打印机的常规操作. 1.打印居中显示 更改居 ...

最新文章

  1. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
  2. Activity的setContentView的流程
  3. iOS 新窗口在最上层
  4. Gradle构建中:No cached version available for offline mode解决方案
  5. mysql default unix_timestamp(now())
  6. PHP常用的缓存技术汇总
  7. Web Services创建、部署、发布
  8. 养兔子Fibo函数优化
  9. 不忘初心,不负韶华——2021年中会议发言之一
  10. 常用傅里叶变换及其性质
  11. 移动端---媒体查询
  12. Linux无线网卡配置 intel 9462 网卡 速度无法超过54Mbit
  13. web前端开发教学视频,web前端开发职业
  14. matlab转化成c语言,matlab转化成c语言的有关问题不会了
  15. JMeter Linux下执行测试
  16. 网页版邮箱提取/采集软件
  17. 怎样在视频画面指定位置编辑马赛克
  18. 实战:战狼2票房数据分析——(1)数据获取及解析
  19. 一篇评价牛顿的搞笑文章,作者老罗,但很有才
  20. python制作天气预报软件(UI界面)

热门文章

  1. 【使用ChatGPT制作PPT】
  2. 如果需求文档不完善,怎么写全面的测试用例 没有产品说明书和需求文档,能做黑盒测试吗?
  3. matlab对信号包络的两种画法
  4. 第一周周工作总结及计划表
  5. HPB钱包助记词生成和备份
  6. 《linux就该这么学——笔记》第7章 使用RAID与LVM磁盘阵列技术
  7. 编程小白 邂逅C语言指针,画图分析真的是我滴神啊
  8. 如何阅读Tendermint的日志
  9. 成功销售心理学(1)
  10. 基于springboot+layui的简易门户网、发布后台