从 TypeScript 到 Java(6):继承、接口与抽象类 —— 构建强类型的扩展体系

系列导读:
前几篇我们了解了类、访问控制、构造函数,现在要进入 Java 的灵魂部分 —— 继承(Inheritance)抽象(Abstraction)

在 TypeScript 中,我们常用 extendsimplements 来实现代码复用与接口约束;
而在 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 注解:
它告诉编译器你是要覆盖父类的方法。
如果方法签名错误(比如拼错或参数不同),编译器会直接报错。

🧩 superthis 的区别

  • 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 类型系统核心 灵活扩展

🚀 实战建议

  1. 写一个 Vehicle 抽象类,定义 start()stop()
  2. 创建 CarBike 实现;
  3. 再定义一个 ElectricPowered 接口,为它们添加 charge() 方法;
  4. 体会抽象类与接口协作的结构感。

🔮 下一篇预告

第 7 篇:《泛型与集合框架 —— 类型安全的数据结构设计》

我们将深入 Java 泛型系统,理解为什么 Java 的 List<T> 与 TypeScript 的 Array<T> 表面相似,却在运行时行为上完全不同。
同时介绍 Java 的核心集合框架(ListMapSet)的设计哲学。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐