extends 是 Java 中实现类继承的关键字,使子类复用父类 public/protected 成员;不继承 private 成员和构造方法,但可通过 super() 调用;用于提取“is-a”关系的共性逻辑,需遵循里氏替换原则。

extends 是 Java 中实现类继承的关键字,它让子类能直接复用父类的非私有成员(字段、方法),是面向对象中“代码复用”最基础也最常用的方式。
明确 extends 的作用边界
使用 extends 后,子类自动获得父类中 public 和 protected 修饰的字段与方法(不包括 private 成员和构造方法)。子类可直接调用,无需重复编写。
- 父类定义通用行为(如
start()、stop()),子类继承后开箱即用 - 子类可选择性重写(override)父类方法,实现差异化逻辑
- 不能继承构造方法,但可通过
super()显式调用父类构造器
提取共性代码的典型步骤
从多个相似类中识别重复逻辑,将其上移到父类,再让子类继承——这是重构的核心思路。
- 观察多个类:比如
Car、Bike、Truck都有brand、speed字段和run()、brake()方法 - 新建父类
Vehicle,把共性字段和方法放进去,并设为 protected 或 public - 各子类用
class Car extends Vehicle声明,立即拥有这些能力 - 若某子类需要特殊行为(如
Car.run()要打印“四轮行驶”),就重写该方法
注意访问控制与设计原则
不是所有代码都适合往上提。滥用 extends 容易导致类层次臃肿或违背“里氏替换原则”。
- 只提取真正通用、稳定、语义上属于“is-a”关系的逻辑(例如“Car is a Vehicle”成立,“Car is a Engine”就不该继承)
- 避免把仅部分子类用到的方法强行塞进父类;此时可考虑接口(
interface)+ 默认方法,或组合(has-a)代替继承 - 父类尽量保持无状态或低耦合,不要在父类构造器中依赖子类未初始化的字段
一个简洁示例
父类封装共性:
class Animal {
protected String name;
public Animal(String name) { this.name = name; }
public void breathe() { System.out.println(name + " 在呼吸"); }
}
子类复用并扩展:
class Dog extends Animal {
public Dog(String name) { super(name); }
public void bark() { System.out.println(name + " 汪汪叫"); }
}
// 使用时:
Dog dog = new Dog("旺财");
dog.breathe(); // 复用父类方法
dog.bark(); // 自己特有方法










