在 Java 面向对象编程(OOP)中,继承方法重写是最核心的两个知识点,也是实现代码复用、功能扩展的关键。今天通过一个超经典的实验案例 ——「中国人与美国人」,用通俗易懂的方式拆解这两个知识点,彻底掌握它们的用法和底层逻辑。

一、先搞懂核心概念:继承 vs 方法重写

1. 什么是继承?

继承就是子类复用父类的属性和方法,就像现实中孩子继承父母的特征一样。

  • 父类(基类):被继承的类,拥有公共的属性和方法
  • 子类(派生类):继承父类的类,能直接用父类的东西,还能新增自己的特性
  • Java 语法:子类 extends 父类
  • 好处:不用重复写代码,提高开发效率,让代码结构更清晰

2. 什么是方法重写(Override)?

子类觉得父类的方法不符合自己的需求,重新定义这个方法的实现,就叫方法重写。

  • 规则:方法名、参数列表、返回值类型必须和父类完全一致
  • 作用:让子类拥有个性化的行为,体现面向对象的多态性

二、案例需求与代码实现

案例结构:People(父类:人类)→ ChinaPeople/AmericanPeople(子类:中国人、美国人)→ BeijingPeople(孙类:北京人)

1. 父类:People.java

这是所有人类的公共父类,定义了人类共有的属性(身高、体重)和方法(打招呼、平均身高 / 体重)。

public class People {
    // 受保护的属性:子类可以直接访问
    protected double weight,height;
    
    // 公共方法:打招呼
    public void speakHello() {
        System.out.println("yayayaya");
    }
    
    // 公共方法:平均身高
    public void averageHeight() {
        height=173;
        System.out.println("average height:"+height);
    }
    
    // 公共方法:平均体重
    public void averageWeight() {
        weight=70;
        System.out.println("average weight:"+weight);
    }
}

✅ 关键点:protected 修饰的属性,子类可以直接使用,这是继承的特性之一。

2. 子类 1:ChinaPeople.java(继承 People)

中国人需要重写父类的打招呼、身高、体重方法,还新增了自己的特色方法「功夫」。

public class ChinaPeople extends People {
    // 重写父类方法:打招呼
    public void speakHello() {
        System.out.println("您好");
    }
    
    // 重写父类方法:平均身高
    public void averageHeight() {
        height = 168.78;
        System.out.println("中国人的平均身高:"+height+" 厘米");
    }
    
    // 【代码1】重写平均体重方法
    public void averageWeight() {
        weight = 65;
        System.out.println("中国人的平均体重:65 公斤");
    }
    
    // 子类独有方法:中国功夫
    public void chinaGongfu() {
        System.out.println("坐如钟,站如松,睡如弓");
    }
}

3. 子类 2:AmericanPeople.java(继承 People)

美国人同样重写父类方法,新增独有方法「拳击」。

public class AmericanPeople extends People {
    // 【代码2】重写打招呼方法
    public void speakHello() {
        System.out.println("How do you do");
    }
    
    // 【代码3】重写平均身高方法
    public void averageHeight() {
        height = 176;
        System.out.println("American's average height:176 cm");
    }
    
    // 重写父类方法:平均体重
    public void averageWeight() {
        weight = 75;
        System.out.println("American's average weight:"+weight+" kg");
    }
    
    // 子类独有方法:美国拳击
    public void americanBoxing() {
        System.out.println("直拳、钩拳、组合拳");
    }
}

4. 孙类:BeijingPeople.java(继承 ChinaPeople)

北京人继承中国人,再次重写方法,拥有更个性化的特征,还新增「京剧」方法。

public class BeijingPeople extends ChinaPeople {
    // 【代码4】重写平均身高方法
    public void averageHeight() {
        height = 172.5;
        System.out.println("北京人的平均身高:172.5 厘米");
    }
    
    // 【代码5】重写平均体重方法
    public void averageWeight() {
        weight = 70;
        System.out.println("北京人的平均体重:70 公斤");
    }
    
    // 独有方法:京剧
    public void beijingOpera() {
        System.out.println("花脸、青衣、花旦和老生");
    }
}

5. 测试类:Example.java

创建对象,调用方法,验证继承和重写的效果:

public class Example {
    public static void main(String args[]) {
        ChinaPeople chinaPeople=new ChinaPeople();
        AmericanPeople americanPeople=new AmericanPeople();
        BeijingPeople beijingPeople=new BeijingPeople();
        
        // 调用打招呼方法
        chinaPeople.speakHello();
        americanPeople.speakHello();
        beijingPeople.speakHello();
        
        // 调用平均身高方法
        chinaPeople.averageHeight();
        americanPeople.averageHeight();
        beijingPeople.averageHeight();
        
        // 调用平均体重方法
        chinaPeople.averageWeight();
        americanPeople.averageWeight();
        beijingPeople.averageWeight();
        
        // 调用子类独有方法
        chinaPeople.chinaGongfu();
        americanPeople.americanBoxing();
        beijingPeople.beijingOpera() ;
        beijingPeople.chinaGongfu();
    }
}

运行结果

您好
How do you do
您好
中国人的平均身高:168.78 厘米
American's average height:176 cm
北京人的平均身高:172.5 厘米
中国人的平均体重:65 公斤
American's average weight:75.0 kg
北京人的平均体重:70 公斤
坐如钟,站如松,睡如弓
直拳、钩拳、组合拳
花脸、青衣、花旦和老生
坐如钟,站如松,睡如弓

三、深度解析:案例中的核心知识点

1. 继承的传递性

Java 继承是多层传递的:PeopleChinaPeopleBeijingPeople北京人不仅能使用ChinaPeople的属性和方法,还能间接使用People的所有内容。比如:beijingPeople.chinaGongfu() 就是继承了中国人的方法。

2. 方法重写的「覆盖效果」

子类重写父类方法后,调用时优先执行子类的方法,父类的方法会被覆盖。

  • 父类PeoplespeakHello()输出yayayaya
  • 子类ChinaPeople重写后,输出您好
  • 创建子类对象调用时,执行的是重写后的方法,这就是重写的核心作用。

3. 子类可以拥有独有功能

继承不只是复用,还能扩展

  • 中国人独有:chinaGongfu()
  • 美国人独有:americanBoxing()
  • 北京人独有:beijingOpera()这些方法父类没有,完美体现了子类的个性化。

4. protected 关键字的作用

父类用protected修饰weightheight,子类可以直接访问和修改。

  • 区别:private只能本类访问,public所有类访问,protected专门给子类使用。

四、方法重写的必守规则

写重写代码时,必须遵守这 5 条规则:

  1. 方法名完全相同
  2. 参数列表完全相同(个数、类型、顺序)
  3. 返回值类型完全相同(基本类型必须一致,引用类型可以是子类)
  4. 子类方法的访问权限不能低于父类(父类 public,子类只能 public)
  5. 不能重写父类finalstaticprivate修饰的方法

五、总结:继承 + 重写的核心价值

  1. 代码复用:父类写一次公共代码,所有子类直接用,不用重复开发
  2. 功能扩展:子类可以重写方法,实现个性化需求,不修改父类代码
  3. 结构清晰:用继承关系描述事物的层级,符合现实世界的逻辑
  4. 多态基础:方法重写是 Java 多态性的前提,是大型项目开发的核心

更多推荐