Java 子类与超类通俗解析——新手也能秒懂
想象一下,你去买手机:
- 你买了一台基础款的 iPhone(叫它“手机”)
- 后来你又买了 iPhone 16 Pro 和 iPhone 16 Pro Max
iPhone 16 Pro 就是“子类”,iPhone 就是“超类”(也叫父类、基类、parent class)。
为什么这么说?
因为 iPhone 16 Pro 直接继承了普通 iPhone 的所有基本功能:
- 打电话
- 发微信
- 上网
- 拍照(虽然拍得更好)
- 玩游戏
同时它还自己加了很多新东西:
- 更好的相机
- 更强的处理器
- 钛金属边框
- 更大的屏幕
这就是继承的核心思想:子类拥有超类的一切,还能扩展自己独有的功能。
一、超类(Superclass / 父类 / 基类)和子类(Subclass / 子类 / 派生类)到底是什么?
| 叫法 | 英文 | 通俗理解 | 谁是谁的“爹” |
|---|---|---|---|
| 超类 | Superclass | 爸爸、老祖宗 | — |
| 父类 | Parent class | 爸爸 | — |
| 基类 | Base class | 基础模板 | — |
| 子类 | Subclass | 儿子、后代 | 继承自超类 |
| 派生类 | Derived class | 从别人派生出来的 | 同上 |
| 扩展类 | Extended class | 在别人基础上扩展出来的 | 同上 |
一句话总结:
子类 = 超类 + 自己独有的东西
二、最简单的代码例子(动物世界版)
// 这是超类(父类)—— 所有动物的“爸爸”
class Animal {
String name; // 名字(所有动物都有)
int age; // 年龄(所有动物都有)
// 所有动物都会吃东西
void eat() {
System.out.println(name + " 在吃东西~");
}
// 所有动物都会睡觉
void sleep() {
System.out.println(name + " 在睡觉 Zzz...");
}
}
// 子类1:狗狗,继承了 Animal
class Dog extends Animal {
String breed; // 狗狗独有的:品种
// 狗狗独有的行为
void bark() {
System.out.println(name + " 在汪汪叫!");
}
// 可以重写(覆盖)父类的方法,让它更符合狗狗
@Override
void eat() {
System.out.println(name + " 在疯狂啃骨头!");
}
}
// 子类2:猫咪,也继承了 Animal
class Cat extends Animal {
boolean isFat; // 猫咪独有的:是否肥宅
void meow() {
System.out.println(name + " 在喵喵叫~");
}
@Override
void eat() {
System.out.println(name + " 在优雅地舔猫罐头...");
}
}
测试代码:
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.name = "旺财";
dog.age = 3;
dog.breed = "金毛";
dog.eat(); // 输出:旺财 在疯狂啃骨头!
dog.sleep(); // 输出:旺财 在睡觉 Zzz... (继承自父类)
dog.bark(); // 输出:旺财 在汪汪叫!
Cat cat = new Cat();
cat.name = "小橘";
cat.age = 2;
cat.isFat = true;
cat.eat(); // 输出:小橘 在优雅地舔猫罐头...
cat.sleep(); // 继承自父类
cat.meow(); // 猫咪独有
}
}
三、继承到底给了我们什么?(核心好处)
| 好处 | 通俗解释 | 代码体现 |
|---|---|---|
| 代码复用 | 写一次,吃一辈子 | 子类不用重复写 eat()、sleep() |
| 统一管理 | 改了爸爸,所有儿子都变 | 改 Animal 的 eat() 所有动物都受影响 |
| 扩展性强 | 想加新动物?再写一个子类就行 | 新建 Bird extends Animal 即可 |
| 多态的基础 | 儿子可以假装是爸爸 | Animal a = new Dog(); |
| 层次结构清晰 | 像家谱一样,一目了然 | 动物 → 哺乳动物 → 犬科 → 狗 |
四、继承中非常重要的几个规则(新手最容易踩坑)
- Java 只支持单继承
一个儿子只能认一个爹(extends 后面只能写一个类)
错误写法:class Dog extends Animal, Pet {}→ 编译报错 - 子类可以访问什么?
- public / protected → 可以直接用
- 默认(包访问)→ 同包可以
- private → 不能直接访问(但可以通过 public/protected 方法间接访问)
- 构造方法不继承
子类构造方法会自动先调用父类的无参构造(隐式调用 super())
如果父类没有无参构造,必须显式写super(参数)放在第一行
class Animal {
Animal(String name) { ... }
}
class Dog extends Animal {
Dog() {
super("旺财"); // 必须写在第一行!
}
}
- 方法重写(Override)
子类可以把父类的方法“改写”成自己的版本
记住:方法名、参数列表完全一样,返回类型尽量一致(可以是子类型) - super 关键字(超级重要!)
super.属性/方法()→ 调用父类的属性或方法super()→ 调用父类的构造方法(必须第一行)
五、一句话总结(背下来就秒懂)
超类(父类)是模板,子类是模板的升级版 + 个性化定制。
子类 = 超类拥有的全部(非 private) + 子类自己新增的 + 子类想改的(重写)
就像:
手机 = 基础功能
智能手机 = 手机 + 触屏 + App + 摄像头 + 指纹解锁……
现在你是不是觉得“子类”和“超类”没那么神秘了?
有任何地方没懂的,比如:
- 多态怎么用?
- super 和 this 区别?
- 为什么 private 不能继承?
- 接口和抽象类又是什么?
直接问我,我继续用最接地气的例子给你讲~