Java子类调用父类方法的3种正确方式,附代码实例
你是不是刚学Java时遇到过这种情况?明明在子类里写了和父类同名的方法,运行结果却不对劲。或者想用父类的某个功能时,控制台突然报错说找不到方法?今天咱们就来聊聊这个让新手小白抓狂的问题——??Java子类到底该怎么正确调用父类方法???
(这里悄悄说个秘密,我刚学Java那会儿,因为没搞懂super关键字,对着报错信息发呆了半小时...)
先说个真实场景
假设你正在开发一个游戏,父类是游戏角色
,子类是战士角色
。当战士使用技能时,既要执行父类的通用攻击动作,又要追加自己的特殊技能。这时候如果不会调用父类方法,代码就会变成复制粘贴父类代码的灾难现场。
方式1:直接使用super关键字
??这是最常用的方法??,就像给你的子类装了个直达父类的电梯。来看这段代码:
java复制class 游戏角色 { void 攻击() { System.out.println("基础攻击!造成10点伤害"); } } class 战士角色 extends 游戏角色 { @Override void 攻击() { super.攻击(); // 重点在这里! System.out.println("追加旋风斩!造成20点额外伤害"); } }
运行战士角色的攻击方法时,控制台会先输出父类的基础攻击,再输出子类的特殊攻击。??注意super必须放在方法第一行??,这个坑我当年踩过——把super写在后面的话,执行顺序就完全反过来了。
方式2:构造方法里的隐藏通道
新手最容易栽跟头的地方就是构造方法。来看这个典型错误案例:
java复制class 父类 { 父类(String name) { System.out.println("创建"+name); } } class 子类 extends 父类 { 子类() { // 这里会报错! } }
??为什么报错??? 因为子类构造方法默认会调用父类的无参构造,但父类没有!这时候必须手动指定:
java复制子类() { super("默认名称"); // 就像给父类递小纸条 }
方式3:当父类方法是private时怎么办
前几天有个学员问我:"老师,我照着教程写super.方法(),为啥提示找不到?" 一看代码,原来父类方法设成了private!??这里有个重要知识点??:子类只能调用父类的public/protected/默认方法,private方法就像上了锁的保险箱,子类根本看不见。
解决方案有两种:
- 把父类方法改成protected
- 在父类添加一个public方法包裹private方法
举个栗子:
java复制class 父类 { private void 隐藏技能() { System.out.println("秘传奥义"); } public void 使用技能() { 隐藏技能(); } } class 子类 extends 父类 { void 我的技能() { super.使用技能(); // 这样就能间接调用 } }
常见问题自问自答
??Q:什么时候必须用super???
A:当子类重写父类方法,但又需要保留父类原有功能时。就像你要改装汽车发动机,但原来的刹车系统还得留着用。
??Q:super能调用爷爷类的方法吗???
A:不能!super只能直达父类,想跨代调用得用其他方式(比如把父类方法改成可继承的)
??Q:为什么我的super调用总报错???
A:检查三点:1.父类是否有这个方法 2.访问权限是否允许 3.是否拼写错误(别笑,我见过把supr写成supper的)
小编观点
教了这么多年Java,发现很多新手卡在继承这里,其实就两个诀窍:??记住super是直通父类的VIP通道??,??构造方法必须对齐参数??。最后说句大实话——别死记硬背,多写几个像战士角色这样的实际案例,比看十篇理论文章都管用。要是今天的内容解决了你一直搞不懂的问题,赶紧打开IDE敲一遍代码,手不生才是硬道理!
本文由嘻道妙招独家原创,未经允许,严禁转载