Java - 封闭类和接口

大家好,未来的Java开发者们!今天,我们将踏上一段令人兴奋的旅程,探索Java中的封闭类和接口。如果你是编程新手,别担心——我们会从基础开始,逐步深入。所以,拿一杯咖啡(或你最喜欢的饮料),让我们开始吧!

Java - Sealed Classes

什么是封闭类和接口?

想象一下,你正在建造一个树屋,并且你想控制谁可以添加房间。这就是Java中的封闭类和接口所做的——它们允许你控制哪些类可以扩展或实现它们。这就像为你的代码设置了一个VIP名单!

封闭类解决的问题

在我们有封闭类之前,任何人都可以扩展你的类或实现你的接口。这就像举办一个派对,却不知道谁会来参加!封闭类给你提供了这份宾客名单的控制权。

如何创建封闭类

让我们从一个简单的例子开始:

public sealed class Animal permits Dog, Cat, Bird {
// Animal类的代码在这里
}

在这个例子中,Animal是我们的封闭类。permits关键字就像我们的保镖,只允许DogCatBird类扩展Animal

扩展封闭类

现在,让我们看看如何创建扩展我们的Animal类的类:

public final class Dog extends Animal {
// Dog类的代码在这里
}

public final class Cat extends Animal {
// Cat类的代码在这里
}

public non-sealed class Bird extends Animal {
// Bird类的代码在这里
}

注意关键字finalnon-sealed。这些很重要:

  • final:这意味着类不能被进一步扩展。就像说,“派对在这里结束!”
  • non-sealed:这允许类被任何其他类扩展。就像说,“快来吧,越多越好!”

封闭接口

就像类一样,接口也可以被封闭。这里有一个例子:

public sealed interface Vehicle permits Car, Motorcycle, Bicycle {
// Vehicle接口的代码在这里
}

以下是实现此接口的方式:

public final class Car implements Vehicle {
// Car类的代码在这里
}

public final class Motorcycle implements Vehicle {
// Motorcycle类的代码在这里
}

public non-sealed class Bicycle implements Vehicle {
// Bicycle类的代码在这里
}

为什么使用封闭类和接口?

  1. 类型安全:你知道哪些类可以扩展或实现你的封闭类或接口。
  2. 更好的设计:它帮助你创建一个更有结构和意图的类层次结构。
  3. 模式匹配:它与switch表达式中的模式匹配配合得很好(这是另一个话题,但相信我,它很酷!)

现实世界示例

让我们创建一个更复杂的例子。想象我们正在构建一个简单的游戏,有不同的角色类型:

public sealed abstract class GameCharacter permits Warrior, Mage, Archer {
protected String name;
protected int health;

public GameCharacter(String name, int health) {
this.name = name;
this.health = health;
}

public abstract void attack();
}

public final class Warrior extends GameCharacter {
public Warrior(String name) {
super(name, 100);
}

@Override
public void attack() {
System.out.println(name + "挥舞着强大的剑!");
}
}

public final class Mage extends GameCharacter {
public Mage(String name) {
super(name, 75);
}

@Override
public void attack() {
System.out.println(name + "施放了一个强大的咒语!");
}
}

public non-sealed class Archer extends GameCharacter {
public Archer(String name) {
super(name, 80);
}

@Override
public void attack() {
System.out.println(name + "射出了一支精准的箭!");
}
}

在这个例子中,我们创建了一个封闭的抽象类GameCharacter和三个允许的子类:WarriorMageArcher。每个子类都有自己的attack()方法的实现。

让我们看看如何使用这些类:

public class Game {
public static void main(String[] args) {
GameCharacter[] characters = {
new Warrior("康纳"),
new Mage("甘道夫"),
new Archer("莱戈拉斯")
};

for (GameCharacter character : characters) {
character.attack();
}
}
}

运行此代码后,你会看到:

康纳挥舞着强大的剑!
甘道夫施放了一个强大的咒语!
莱戈拉斯射出了一支精准的箭!

结论

封闭类和接口是Java中强大的工具,允许你创建更有控制和意图的类层次结构。它们就像你代码中的保镖,确保只有正确的类能加入派对!

记住,编程就是解决问题和创建结构。封闭类和接口是你工具箱中的另一个工具,帮助你编写更干净、更易于维护的代码。

继续练习,继续编码,最重要的是,玩得开心!在你意识到之前,你将成为封闭类的高手。下次见,快乐编码!

方法 描述
permits 指定哪些类被允许扩展封闭类或实现封闭接口
sealed 声明一个类或接口为封闭
non-sealed 允许封闭类的子类被任何类扩展
final 防止类被进一步扩展

Credits: Image by storyset