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("Conan"),
new Mage("Gandalf"),
new Archer("Legolas")
};

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

當你運行這段代碼時,你會看到:

Conan 挥舞著強大的劍!
Gandalf 呪咒了一個強大的法術!
Legolas 射出了一支精準的箭!

結論

封印類別與介面是 Java 中強大的工具,可以讓你創建有更多控制且有意圖的類別階層。它們就像你代碼的安保人員,確保只有正確的類別能夠加入派對!

記住,編程就是解決問題和創建結構。封印類別和介面只是你工具箱中的另一個工具,幫助你编写更乾淨、更易維護的代碼。

持續練習,持續編碼,最重要的是,玩得開心!在你意識到之前,你將能夠像專家一樣封印類別。直到下次,編程愉快!

方法 描述
permits 指定哪些類別可以繼承封印類別或實現封印介面
sealed 声明一個類別或介面為封印
non-sealed 允許封印類別的子類別被任何類別繼承
final 防止類別被進一步繼承

Credits: Image by storyset