Hey,大家好呀!我是小米,一个29岁热爱分享技术的大哥哥。今天又是元气满满的一天,我们继续来聊聊那些看似简单却让面试官疯狂加戏的Java面试题。这次的主角是super关键字!
super这个东西啊,初学者用得少,老鸟也未必熟悉,但它的妙用可不少。在社招面试中,要是面试官突然问起它,千万别慌!咱今天就通过一个轻松的故事,带你彻底掌握super关键字的精髓!
故事背景:代码中的家族纷争
有一天,小明被分配到一个项目中。项目里有个Animal类和Dog类,还有一堆代码看着就头大。他翻开代码的第一行:
没过几秒,又找到了继承它的Dog类:
小明轻松地运行代码:
结果果然没问题,输出:
一切看似正常,但小明发现,需求有变!项目经理说:“狗在自我介绍时,得先强调它是一种动物。能不能加个方法,调用父类的name和name对应的speak()方法?”
super登场,解决家族矛盾
小明这时回忆起培训时学的super关键字。于是,他修改了Dog类:
他重新运行代码,输出变成了:
super关键字的妙用全解
到这里,项目经理很满意,但小明觉得不够!作为一个技术Geek,他决定深入探究super关键字的更多用途,准备在面试里炫技。
1. super调用父类的构造方法
运行代码:
输出结果:
小明总结:
super必须是子类构造方法的第一行,用来调用父类的构造器。如果父类没有无参构造器,而子类没有明确调用父类的构造器,编译会报错。
super访问父类的成员变量
小明决定再验证super是否能访问父类的同名成员变量:
运行代码:
输出结果:
小明总结:
super.成员变量可以直接访问父类的成员变量,避免子类变量重名时引发冲突。
super调用父类的普通方法
这点在刚刚的super.speak()已经体现过了,但小明决定深入再测试一下。
运行代码:
输出结果:
小明总结:
子类方法中,super.方法名()可以直接调用父类的方法。
面试官的加戏题
刚好赶上社招面试,面试官拿出了super的经典问题:多层继承下,super调用的是哪一层的方法?
小明又准备了代码:
运行代码:
输出结果:
小明回答面试官:“super总是指向直接的父类,而不是跨越多层去调用更远的祖先类。”
总结与收获
在这个小故事里,我们看到super有以下几大核心用法:
- 调用父类的构造方法:super()必须是子类构造方法的第一行,用来初始化父类的构造器。
- 访问父类的成员变量:super.变量名用于访问父类的同名变量。
- 调用父类的方法:super.方法名()可以直接调用父类的普通方法,甚至是在重写时保留父类的逻辑。
最后的小彩蛋!
面试官问完后,小明还主动补充:“在实际项目中,super的使用频率可能不高,但在继承关系复杂的代码里,它能清晰表达对父类成员的操作,帮助我们避免不必要的混淆。”
面试官大赞:“不错,你过了!”
END
希望这篇文章能让大家对super关键字有更深的理解!如果还有其他Java面试题想听小米讲解,欢迎留言~ 咱们下期见啦!
我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!