Java子类如何获取并调用父类方法?代码演示
(拍大腿)哎!刚学Java那会儿,我最头疼的就是这个继承关系里的方法调用。明明在父类写好的方法,到子类怎么就找不到了?今天咱们就掰开了揉碎了说说这事儿,保证你看完能拍着胸脯说:"就这?"
一、为啥要折腾父类的方法?
举个现实点的例子啊(掏出手机),你看手机都有开机功能吧?假设小米手机继承自"手机"这个父类,现在要给小米手机加个虹膜解锁的新功能。这时候咱们既要用原来的开机方法,又要加新功能,总不能把父类代码复制一遍吧?这就得靠继承里的方法调用了。
二、super关键字:你的万能钥匙
??重点来了!?? 这个长得像超级英雄的super
关键字,就是访问父类方法的直达电梯。咱们直接看代码更明白:
java复制class 手机 { void 开机(){ System.out.println("长按电源键3秒"); } } class 小米手机 extends 手机 { @Override void 开机() { super.开机(); // 先执行父类原有开机方法 System.out.println("虹膜扫描中..."); } }
(敲黑板)注意看这里!当子类重写开机方法时,用super.开机()
就能先执行父类的原始操作。这就好比装修房子时,咱们可以在原来的墙面上贴壁纸,不用把整面墙拆了重建。
三、方法重写的正确姿势
很多新手容易在这里栽跟头,咱们得说说注意事项:
- ??方法签名要一模一样??(就像办护照复印件不能少字)
- 访问权限不能比父类更严格(父类用public,子类不能用protected)
- 返回值类型要兼容(可以用子类类型替代父类类型)
举个反例警示下:
java复制class 父类 { public void 吃饭() { ... } } class 子类 extends 父类 { private void 吃饭() { ... } // 这样编译直接报错! }
(摊手)看到了吧?把public改成private就像给自家大门加了三道锁,连快递都进不来,肯定不行啊!
四、反射调用:非常时期的非常手段
虽然不推荐新手用,但咱们也得知道有这招。比如父类方法被藏起来了(private修饰),这时候反射就能派上用场:
java复制public class 黑科技 { public static void main(String[] args) throws Exception { 子类 obj = new 子类(); Method 父类方法 = obj.getClass().getSuperclass() .getDeclaredMethod("隐藏方法"); 父类方法.setAccessible(true); 父类方法.invoke(obj); } }
(扶眼镜)这就好比用万能钥匙开保险箱,虽然能开但风险大。建议先用常规方法解决,实在没招了再用反射。
五、那些年我踩过的坑
- ??过度使用super??:有个项目我见人就写super.method(),结果父类一改方法名,200多个子类全崩了(捂脸)
- ??构造方法陷阱??:子类构造方法里如果不写super(),Java会偷偷给你加个无参super()。要是父类没有无参构造方法...(你懂的)
- ??多层继承噩梦??:爷爷类的方法用super调用,在爸爸类又被重写,到孙子类就彻底懵圈了
六、什么时候该用/不该用?
(托腮思考)根据我的项目经验:
? 适合用的情况:
- 扩展父类功能(比如先验证权限再执行操作)
- 模板方法模式(父类定框架,子类填细节)
- 兼容旧版本代码
? 别用的情况:
- 父类方法即将废弃时
- 需要完全改变原有逻辑时
- 性能要求极高的场景(多次super调用会影响效率)
七、个人血泪教训
刚工作那会儿,我觉得继承就是"万能胶",见着重复代码就用继承。结果项目做到后期,类之间的关系复杂得跟蜘蛛网似的。后来才明白,继承就像吃火锅时的麻酱——适量提鲜,过量就糊嘴了。
现在我的原则是:能组合不用继承,必须继承时严格控制层级。就像收拾衣柜,把衣服按季节分类(继承)虽然方便,但要是分得太细(比如按颜色分三层),找件衣服得翻半天,反而效率更低。
(喝水)说到底,技术没有好坏,关键看用得是否恰当。就像这把super钥匙,用好了是解决问题的利器,用不好就成了埋雷的铲子。咱们下回见!