从 TypeScript 到 Java(6):继承、接口与抽象类 —— 构建强类型的扩展体系
从 TypeScript 到 Java(6):继承、接口与抽象类 —— 构建强类型的扩展体系
系列导读:
前几篇我们了解了类、访问控制、构造函数,现在要进入 Java 的灵魂部分 —— 继承(Inheritance) 与 抽象(Abstraction)。在 TypeScript 中,我们常用
extends、implements来实现代码复用与接口约束;
而在 Java 中,这套机制更加严格、结构化,是整个面向对象世界的基础。
☕ 一句话理解
Java 的继承体系是 单继承 + 多接口实现 + 抽象层封装。
它比 TypeScript 更注重“语义约束”与“设计模式”,
是从脚本型语言到工程型语言的关键转折点。
🧱 继承(Inheritance)—— 代码复用的基石
在 Java 中,一个类可以从另一个类继承,使用 extends:
class Animal {
public void eat() {
System.out.println("Eating...");
}
}
class Dog extends Animal {
public void bark() {
System.out.println("Woof!");
}
}
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat(); // 从父类继承
dog.bark(); // 子类自有方法
}
}
输出:
Eating...
Woof!
📘 特点:
- 子类继承父类的所有 非 private 成员;
- 可重写(override)父类方法;
- Java 只支持单继承(一个类只能继承一个父类)。
🧬 方法重写(Override)
子类可以修改父类的行为:
class Animal {
public void makeSound() {
System.out.println("Some sound...");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow~");
}
}
🧠 注意 @Override 注解:
它告诉编译器你是要覆盖父类的方法。
如果方法签名错误(比如拼错或参数不同),编译器会直接报错。
🧩 super 与 this 的区别
this:引用当前类实例;super:引用父类实例。
示例:
class Animal {
public void eat() {
System.out.println("Animal eating");
}
}
class Dog extends Animal {
@Override
public void eat() {
super.eat(); // 调用父类方法
System.out.println("Dog eating bones");
}
}
输出:
Animal eating
Dog eating bones
🧭 接口(Interface)—— 行为契约
Java 接口是一种纯抽象结构,用于定义“类应该做什么”,而不是“怎么做”。
interface Flyable {
void fly(); // 抽象方法,无实现
}
class Bird implements Flyable {
public void fly() {
System.out.println("Bird flying!");
}
}
特点:
- 接口中的方法默认是
public abstract; - 类通过
implements实现接口; - 一个类可以实现 多个接口。
class SuperBird implements Flyable, Runnable {
public void fly() { System.out.println("Flying high"); }
public void run() { System.out.println("Running fast"); }
}
这让 Java 弥补了“单继承”的限制,通过多接口组合,实现多重行为扩展。
⚙️ 默认方法(Default Method)
从 Java 8 开始,接口可以带默认实现:
interface Logger {
default void log(String msg) {
System.out.println("LOG: " + msg);
}
}
实现类可以直接使用,也可以重写:
class ConsoleLogger implements Logger {}
new ConsoleLogger().log("Hello");
// 输出:LOG: Hello
对比 TypeScript:
interface Logger {
log?(msg: string): void;
}
TypeScript 的接口不能有方法体,Java 的 default 提供了轻量的复用机制。
🏗️ 抽象类(Abstract Class)—— 模板与骨架
抽象类是介于普通类与接口之间的存在:
它可以包含:
- 抽象方法(未实现)
- 已实现的方法
- 成员变量
abstract class Shape {
abstract double area(); // 抽象方法
public void info() {
System.out.println("This is a shape.");
}
}
class Circle extends Shape {
private double r;
public Circle(double r) { this.r = r; }
@Override
double area() {
return Math.PI * r * r;
}
}
使用:
Shape s = new Circle(2.0);
s.info();
System.out.println(s.area());
输出:
This is a shape.
12.566370614359172
⚖️ 抽象类 vs 接口:如何选择?
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 继承方式 | 只能继承一个 | 可实现多个 |
| 是否含状态 | ✅ 可以有字段 | ❌ 只能常量 |
| 构造函数 | ✅ 有 | ❌ 无 |
| 默认实现 | ✅ 支持具体方法 | ✅ 可有 default |
| 设计目标 | 建立基础模板 | 定义能力契约 |
简而言之:
- 抽象类 = “我是什么”(定义共性)
- 接口 = “我能做什么”(定义能力)
TypeScript 中 abstract class 与 Java 的概念几乎一致,但接口在 TS 中更灵活(可选属性、联合类型等)。
💬 现实应用场景
| 场景 | Java 推荐方式 |
|---|---|
| 动物继承共同行为 | 抽象类 Animal |
| 定义统一行为接口(如可排序、可序列化) | 接口 Interface |
| 组件框架层定义扩展点 | 抽象类 + 接口组合 |
| 多能力组合(如飞行+游泳) | 多接口实现 |
示例:
interface Flyable { void fly(); }
interface Swimmable { void swim(); }
class Duck implements Flyable, Swimmable {
public void fly() { System.out.println("Duck flying"); }
public void swim() { System.out.println("Duck swimming"); }
}
🔍 TypeScript 对比示意
interface Flyable {
fly(): void;
}
abstract class Animal {
abstract eat(): void;
}
class Bird extends Animal implements Flyable {
eat() { console.log("Pecking seeds"); }
fly() { console.log("Flying high"); }
}
差异总结:
| 特性 | Java | TypeScript |
|---|---|---|
| 多继承 | ❌ | ✅(类 + 接口组合) |
| 多接口 | ✅ | ✅ |
| 抽象类 | ✅ | ✅ |
| 默认实现 | ✅(default) | ❌ |
| 强制实现检查 | 编译时 | 编译时(较宽松) |
🧠 设计哲学总结
Java 的设计强调:
- 单一继承:保持结构清晰;
- 多接口:灵活组合能力;
- 抽象类:提供统一模板;
- 封装 + 多态:建立健壮系统。
而 TypeScript 更偏向灵活表达、快速开发。
学习 Java 的继承体系,可以让你在工程设计上更具“结构化思维”。
🧭 小结
| 概念 | 关键作用 | 关键词 |
|---|---|---|
| 继承(extends) | 复用父类逻辑 | 代码复用 |
| 方法重写(@Override) | 改写父类方法 | 多态 |
| 接口(implements) | 定义行为能力 | 契约 |
| 抽象类(abstract) | 提供基础模板 | 继承框架 |
| 单继承 + 多接口 | Java 类型系统核心 | 灵活扩展 |
🚀 实战建议
- 写一个
Vehicle抽象类,定义start()和stop(); - 创建
Car和Bike实现; - 再定义一个
ElectricPowered接口,为它们添加charge()方法; - 体会抽象类与接口协作的结构感。
🔮 下一篇预告
第 7 篇:《泛型与集合框架 —— 类型安全的数据结构设计》
我们将深入 Java 泛型系统,理解为什么 Java 的 List<T> 与 TypeScript 的 Array<T> 表面相似,却在运行时行为上完全不同。
同时介绍 Java 的核心集合框架(List、Map、Set)的设计哲学。
更多推荐



所有评论(0)