版本:基于 Java 17 & Java 21 LTS

在本篇中,我们将探讨 Java OOP 的高级特性:继承、多态、接口、内部类以及现代 Java 17+ 引入的密封类 (Sealed Classes)


1. 继承 (Inheritance)

继承允许一个类继承另一个类的属性和方法,提高代码重用性。

public class Animal {
    void sound() {
        System.out.println("发出声音...");
    }
}

// 继承:Cat 是 Animal 的一种 (is-a 关系)
public class Cat extends Animal {
    @Override // 强烈建议写上,让编译器帮你检查拼写
    void sound() {
        System.out.println("喵喵喵~");
    }
}

2. 多态 (Polymorphism)

多态是 OOP 的灵魂:父类引用指向子类对象

Animal myAnimal = new Cat(); // 向上转型
myAnimal.sound(); // 虽然是用 Animal 声明,但实际调用的是 Cat 的方法

现代模式匹配 (Pattern Matching for instanceof)

Java 16+ 引入了更优雅的方式来判断并转换类型:

if (myAnimal instanceof Cat c) {
    // 自动将 myAnimal 强转为 c,不再需要 (Cat)myAnimal 的旧式写法
    c.sound();
}

3. 接口 (Interface)

接口定义了“契约”,即“能做什么”,而不是“怎么做”。现代 Java 接口非常强大。

3.1 默认方法与静态方法 (Java 8+)

public interface Playable {
    void play(); // 抽象方法

    // 默认方法:子类可以直接使用或重写
    default void stop() {
        System.out.println("停止播放");
    }

    // 静态方法:只能通过接口名调用
    static void info() {
        System.out.println("Playable 接口 v1.0");
    }
}

4. 内部类 (Inner Classes)

Java 允许在一个类内部定义另一个类。

  • 成员内部类:依赖于外部类对象存在。

  • 静态内部类:不依赖外部类对象,通常作为工具类。

  • 匿名内部类:没有名字的类,通常用于快速实现接口。

// 匿名内部类实现接口 (传统写法)
Playable p = new Playable() {
    @Override
    public void play() {
        System.out.println("正在玩...");
    }
};

5. 现代 Java 特性:密封类 (Sealed Classes)

Java 17 引入了 sealed 关键字。在旧版中,父类无法控制谁能继承它。密封类允许你精确控制继承体系。

// 定义:只有 Circle 和 Rectangle 可以继承 Shape
public sealed class Shape permits Circle, Rectangle {}

// 子类必须标记为 final, sealed, 或 non-sealed
public final class Circle extends Shape {}
public final class Rectangle extends Shape {}

本章小结

第五篇我们深度学习了:

  1. 继承体系及方法重写 (@Override)。

  2. 多态的威力及其在 Java 16+ 中的模式匹配。

  3. 接口的演进:抽象方法、默认方法与静态方法。

  4. 内部类:各类内部类的定义与应用场景。

  5. 密封类 (Sealed Classes):Java 17 核心特性。

下一篇预告:常用 API 篇 (String, DateTime, Optional, BigDecimal)