Skip to content
第 6 章 后端 ⏱ 10 分钟阅读

第 6 章:继承 ​

学习目标 ​

  • 理解继承的本质(代码复用)
  • 掌握 extends 和 super 用法
  • 学会方法重写(Override)
  • 避开继承的常见坑

一、extends:子类继承父类 ​

java
// 父类
class Animal {
    public String name;
    public int age;

    public void eat() {
        System.out.println(name + " 在吃东西");
    }
}

// 子类
class Dog extends Animal {        // 用 extends
    public String breed;          // 子类新增字段

    public void bark() {          // 子类新增方法
        System.out.println(name + " 在汪汪叫");
    }
}

Dog dog = new Dog();
dog.name = "旺财";                // 来自父类
dog.bark();                       // 来自子类
dog.eat();                        // 来自父类

二、方法重写(Override) ​

子类重写父类方法,实现自己的行为:

java
class Animal {
    public void sound() {
        System.out.println("动物叫");
    }
}

class Dog extends Animal {
    @Override                       // 注解,编译器帮你检查重写是否合法
    public void sound() {
        System.out.println("汪汪汪");
    }
}

重写规则:

  • ✅ 方法签名相同(方法名 + 参数列表 + 返回类型)
  • ✅ 访问修饰符不能更严格(如父类是 public,子类不能是 private)
  • ❌ 参数列表不同 = 是重载而不是重写

⚠️ 坑 1:@Override 注解必须加,编译器会检查重写是否正确,避免你写错签名还以为是对的。

三、super:调用父类 ​

java
class Dog extends Animal {
    private String breed;

    public Dog(String name, int age, String breed) {
        super(name, age);            // ① 调用父类构造器(必须是第一行)
        this.breed = breed;
    }

    @Override
    public void sound() {
        super.sound();                // ② 调用父类方法
        System.out.println("汪汪汪");
    }
}

⚠️ 坑 2:子类构造器里如果没显式 super(...),编译器会自动加一个 super()(父类无参构造器)。如果父类没有无参构造器,编译报错。

java
class Animal {
    public Animal(String name) { ... }   // 没有无参构造器
}
class Dog extends Animal {
    public Dog() { }                     // ❌ 报错:父类没有无参构造器
    public Dog(String name) {
        super(name);                     // ✅ 必须显式调用
    }
}

四、Java 单继承 ​

Java 只支持单继承(一个类只能 extends 一个父类),但可以通过接口实现多继承的效果(下章讲)。

java
class A { }
class B { }
// class C extends A, B { }   // ❌ Java 不支持多继承

// ✅ 用接口实现多继承
class C extends A implements B { }

五、继承的使用建议 ​

能用组合就别用继承(组合优于继承原则):

java
// ✅ 组合:把另一个类作为自己的字段
class Car {
    private Engine engine;           // 持有 Engine 引用
    public void start() {
        engine.start();              // 委托给 engine
    }
}

// ❌ 继承滥用:任何"is-a"都继承,导致类爆炸
class ElectricCar extends Car { }
class GasCar extends Car { }
class HybridCar extends Car { }
// 真实项目应该用策略模式/组合

⚠️ 坑 3:继承层次不要太深(超过 3 层就难维护),优先用组合。

六、本章小结 ​

要点关键
extends子类继承父类的字段和方法
Override子类重写父类方法,必须加 @Override
supersuper(...) 调用父类构造器,super.xxx() 调用父类方法
单继承Java 一个类只能继承一个父类
构造器链子类构造器必须调用父类构造器(显式或隐式)

动手练习 ​

  1. Animal 继承体系:Animal → Dog / Cat,各自重写 sound()
  2. Employee 继承:Person → Employee,Employee 有 salary 字段
  3. 方法重写练习:父类 Shape 有 area() 方法,子类 Circle / Rectangle 重写

下一章:第 7 章:多态 →

本站基于 VitePress 构建 · 由 StackHub 团队维护