阿里巴巴难度系数五颗星的试题,小白竟然说很简单
牛客网上有道阿里巴巴的面试题,网站显示该题难度系数五颗星
原题
代码如下:
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、子类引用指向子类的对象,在涉及父类方法调用时,比如调用父类构造函数、父类代码块涉及重写函数等参照第一条,调用子类的方法
阿里巴巴难度系数五颗星的试题,小白竟然说很简单相关推荐
- sql优化的15个小技巧(必知五颗星),面试说出七八个就有了
目录 前言 1 避免使用select * 2 用union all代替union 3 小表驱动大表 4 批量操作 5 多用limit 6 in中值太多 7 增量查询 8 高效的分页 9 用连接查询代替 ...
- 索引失效的10种场景,你知道几个呢?(必知五颗星)
目录 前言 1. 准备工作 1.1 创建user表 1.2 插入数据 1.3 查看数据库版本 1.4 查看执行计划 2. 不满足最左匹配原则 2.1 哪些情况索引有效? 2.2 哪些情况索引失效? 3 ...
- 打印5列五颗星_王者荣耀段位排列每个段位多少星?段位排列标志多久刷新一次?[多图]...
王者荣耀段位排列有很多个不同的段位,那么这些段位中每个段位是多少星?玩家们比较在乎段位的问题,那么今天游戏鸟小编就带着大家一起来了解段位排列的情况,另外下面还会有段位排列标志的刷新时间介绍哦! 王者荣 ...
- 打印5列五颗星_王者荣耀段位排列每个段位多少星?段位排列标志多久刷新一次?...
王者荣耀段位排列有很多个不同的段位,那么这些段位中每个段位是多少星?玩家们比较在乎段位的问题,那么今天游戏鸟小编就带着大家一起来了解段位排列的情况,另外下面还会有段位排列标志的刷新时间介绍哦! 王者荣 ...
- 某销售公司在年末的时候会向员工发放红包,发放的红包金额共有5种,获取的条件各不相同: 1) 五颗星红包,每人8000元,平均月绩效大于80件商品(>80),并且在本年度满勤; 2) 四颗星红包,每
某销售公司在年末的时候会向员工发放红包,发放的红包金额共有5种,获取的条件各不相同: 五颗星红包,每人8000元,平均月绩效大于80件商品(>80),并且在本年度满勤: 四颗星红包,每人4000 ...
- jar包是什么意思_面试难度五颗星:JVM有Full GC,为什么还会 OutOfMemoryError?
点击上方蓝色"后端面试那些事儿",选择"设为星标" 学最好的别人,做最好的我们 来源:R 大 zhihu.com/question/38511221 问题: R ...
- UC浏览器主界面滑动折叠效果 使用自定义behavior实现 难度五颗星*****
思路:!!!!!!!!!!! RcycleView上的HeadScrollBehavior 思路: 1.让recycleview居于头部的下方 ---方案: 重写layoutDependsOn 让当 ...
- 题目: 打印输出上下左右对称的,第一行一颗星,第二行三颗星,第三行五颗星,第四行七颗星,第五行五颗星,第六行三颗星,第七行一颗星
题目: 打印输出 * *** ***** ******* ***** *** * /* 分析: 前4行,行数1 2 3 4 ...
- 打印5列五颗星_13个Excel快捷打印技巧,让你熟练掌握打印机操作
对于许多朋友来说,用Excel打印文件仍然是一个头条的问题,文件如何在表格中进行打印设置许多朋友还是比较陌生.今天我们就通过13个打印小技巧,让大家了解一下打印机的常规操作. 1.打印居中显示 更改居 ...
最新文章
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
- Activity的setContentView的流程
- iOS 新窗口在最上层
- Gradle构建中:No cached version available for offline mode解决方案
- mysql default unix_timestamp(now())
- PHP常用的缓存技术汇总
- Web Services创建、部署、发布
- 养兔子Fibo函数优化
- 不忘初心,不负韶华——2021年中会议发言之一
- 常用傅里叶变换及其性质
- 移动端---媒体查询
- Linux无线网卡配置 intel 9462 网卡 速度无法超过54Mbit
- web前端开发教学视频,web前端开发职业
- matlab转化成c语言,matlab转化成c语言的有关问题不会了
- JMeter Linux下执行测试
- 网页版邮箱提取/采集软件
- 怎样在视频画面指定位置编辑马赛克
- 实战:战狼2票房数据分析——(1)数据获取及解析
- 一篇评价牛顿的搞笑文章,作者老罗,但很有才
- python制作天气预报软件(UI界面)