继承(inheritance)让子类获得父类已经定义的属性和方法,并在此基础上增加或改变行为。它适合稳定的“是一种”(is-a)关系:Food 是一种 Product,Drink 也是一种 Product。父类保存真正共有的部分,子类只描述差异,从而避免重复。
生活中,交通工具可以提供品牌和移动行为;自行车补充踏板,汽车补充发动机。继承并不表示把父类对象复制一遍,而是建立类型关系:寻找方法时,Java 会先看当前子类,找不到再沿继承链向父类查找。
父类构造与子类扩展
互动实验
继承装配线:父类部分流向子类
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
本节按“一类一个文件”组织代码,接口也单独保存。文件名与类型名一致;同一组示例的文件放在同一目录,不同组示例请使用独立目录,避免同名类互相冲突。
Product.java
public class Product {
private final String name;
private final double price;
Product(String name, double price) {
this.name = name;
this.price = price;
}
String getName() { return name; }
double getPrice() { return price; }
}Food.java
public class Food extends Product {
private final int calories;
Food(String name, double price, int calories) {
super(name, price);
this.calories = calories;
}
}Drink.java
public class Drink extends Product {
private final String size;
Drink(String name, double price, String size) {
super(name, price);
this.size = size;
}
}知识测验
题目
Food extends Product 表达什么关系?
知识测验
题目
super(name, price) 的作用是什么?
重写与方法查找
子类定义一个与父类签名相同的方法,就是方法重写(override)。调用 food.toString() 时,Java 优先使用 Food 的版本。子类版本仍可通过 super.toString() 调用父类实现,这适合“保留公共结果,再添加细节”。
Product.java
public class Product {
private final String name;
private final double price;
Product(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return String.format("%s (%.2f)", name, price);
}
}Food.java
public class Food extends Product {
private final int calories;
Food(String name, double price, int calories) {
super(name, price);
this.calories = calories;
}
@Override
public String toString() {
return String.format("Food: %s, %d kcal", super.toString(), calories);
}
}Main.java
public class Main {
public static void main(String[] args) {
Food food = new Food("Cheeseburger", 5.45, 302);
System.out.println(food);
}
}互动实验
汉堡店对象厨房:父类配方 + 子类配料
访问权限PRO
PRO EXCLUSIVE探索不止于此
尊享 Pro 权益解锁完整互动实验、进阶解析与精选参考答案。
知识测验
题目
子类重新定义 toString() 叫什么?
知识测验
题目
重写方法里为什么还会调用 super.toString()?
动手练习
让电子书继承产品
- Product 保存 name 和 price。
- EBook(Product) 增加 file_size。
- 使用 super 初始化共有字段。
- 打印三个字段。
动手练习
重写通知方法
- Notification.send() 返回通用消息。
- EmailNotification 和 SMSNotification 继承它。
- 分别重写 send(),返回带渠道名称的消息。
- 各创建一个对象并调用。
动手练习
扩展餐厅菜单模型
- 建立 Product(name, price) 和 toString。
- Food 增加 calories,Drink 增加 size。
- 两个子类都调用 super 并重写 toString。
- 创建至少两个 Food 和两个 Drink,逐个打印。