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岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货!