1. 主页 > 好文章

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方法就像上了锁的保险箱,子类根本看不见。

解决方案有两种:

  1. 把父类方法改成protected
  2. 在父类添加一个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敲一遍代码,手不生才是硬道理!

本文由嘻道妙招独家原创,未经允许,严禁转载