正常情況下,只要某個class沒有final
修飾符,那么任何類都可以從該class繼承。
從Java 15開始,允許使用sealed
修飾class,並通過permits
明確寫出能夠從該class繼承的子類名稱。
例如,定義一個Shape
類:
public sealed class Shape permits Rect, Circle, Triangle { ... }
上述Shape
類就是一個sealed
類,它只允許指定的3個類繼承它。如果寫:
public final class Rect extends Shape {...}
是沒問題的,因為Rect
出現在Shape
的permits
列表中。但是,如果定義一個Ellipse
就會報錯:
public final class Ellipse extends Shape {...} // Compile error: class is not allowed to extend sealed class: Shape
原因是Ellipse
並未出現在Shape
的permits
列表中。這種sealed
類主要用於一些框架,防止繼承被濫用。