[public|protected|private] [abstract|final] class 類別名 {
// 類別內容
}
修飾子說明:
• 一個 .java 檔**僅能有一個**與檔名同名的 public 類別。
• 同一檔案可定義多個非 public 類別(default/abstract/final),但不提倡(僅限檔案內部使用)。
public class Outer {
private class PrivateInner {} // 僅外部類可見
public class PublicInner {} // 外部可見
}
外部存取語法: new Outer.PublicInner() —— 與靜態方法呼叫語法一致。
private 類別只能透過此語法定義。
public abstract class Vehicle {
public abstract float speed(); // 抽象方法:無實作,強制子類實作
public void run() { ... } // 具體方法:預設行為
public void stop() { ... }
public boolean isMoving() { ... }
}
核心價值:定義一類物件的通用行為(具體方法),預留差異點(抽象方法)強制子類實作。適用於「預期每個子類都會有自己具體實作」的場景。
public final class FinalClass {}
禁止被繼承,通常用於工具類、不可變物件(如 String)。
public interface MyInterface {
public static final String CONSTANT = "test"; // 隱含 public static final
public void publicMethod(); // 隱含 public abstract
void defaultMethod() throws Exception; // 介面方法預設 public abstract
}
實作類:
public class MyInterfaceImpl implements MyInterface {
public void publicMethod() { ... }
public void defaultMethod() throws Exception { ... } // 必須為 public
}
規則:
• 一類可實作多介面(用逗號分隔)。
• 介面方法名衝突但回傳型別不同 → 編譯錯誤。
• 所有介面方法實作**必須為 public**。
MyInterface intf = new MyInterfaceImpl();
intf.publicMethod(); // 可呼叫
intf.defaultMethod(); // 編譯錯誤!介面中為 default,視為 package-private
((MyInterfaceImpl)intf).defaultMethod(); // 強轉後可呼叫
啟示:介面方法**建議全部顯式宣告 public**,避免指標呼叫受限。
getInstance() 回傳介面,調用方透明化。多型賦值相容性同樣適用。