第 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()(父类无参构造器)。如果父类没有无参构造器,编译报错。javaclass 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 |
| super | super(...) 调用父类构造器,super.xxx() 调用父类方法 |
| 单继承 | Java 一个类只能继承一个父类 |
| 构造器链 | 子类构造器必须调用父类构造器(显式或隐式) |
动手练习
- Animal 继承体系:Animal → Dog / Cat,各自重写
sound() - Employee 继承:Person → Employee,Employee 有 salary 字段
- 方法重写练习:父类
Shape有area()方法,子类Circle/Rectangle重写
下一章:第 7 章:多态 →