頂層類(Top-Level Class),是 Java 中對類的一種定義方式。在 .java 文件中,處於最外層的類就稱為頂層類,在其外部不存在將其包圍起來的任何代碼塊。頂層類只能聲明為 public 或包私有的。在 .java 文件中,只能有一個與其文件名同名的、聲明為 public 的頂層類。 ...
前言
本文內容根據 Java 官方教程中的《課程:類和對象》編寫而成。
本文提供的是 JDK 14 的示例代碼。
定義
頂層類(Top-Level Class),是 Java 中對類的一種定義方式。在 .java
文件中,處於最外層的類就稱為頂層類,在其外部不存在將其包圍起來的任何代碼塊。下麵的示例就是一個典型的頂層類:
1 /** 2 * 定義一個公共的頂層類。 3 */ 4 public class MyClass { 5 public static void main(String[] args) { 6 System.out.println("Hello World!"); 7 } 8 } 9 /* 輸出結果: 10 Hello World! 11 12 */
概述
聲明頂層類
在前面的示例中,已經看到瞭如何定義一個頂層類。這就是一個頂層類的聲明。頂層類可以聲明為 public
,如前面示例中的 MyClass 類,也可以聲明為包私有的,如下:
1 /** 2 * 定義一個包私有的頂層類。 3 */ 4 class PackagePrivateClass { 5 public static void main(String[] args) { 6 System.out.println("PackagePrivateClass:這是一個包私有的頂層類。"); 7 } 8 } 9 /* 輸出結果: 10 PackagePrivateClass:這是一個包私有的頂層類。 11 12 */
- 提示:在定義一個類時,如果在
class
關鍵字前不加public
、private
或protected
關鍵字,那麼這個類就聲明為包私有的(Package-Private),即它是類的預設聲明。包私有的類可在其所在的包內共用,但不能跨包共用。
不允許將頂層類聲明為 private
或 protected
,因為頂層類在本質上不屬於私密類。如果將一個頂層類用 private
或 protected
關鍵字隱藏起來(即不對外共用),那就無法創建這個類的實例,等同於沒有定義這個類。
此外,不允許將頂層類聲明為 static
,因為頂層類在本質上是非靜態的,只有在創建其實例時,才會將其載入到記憶體中。否則,Java 編譯器將會生成一條類似於“此處不允許使用修飾符 static
”的錯誤消息。
併列多個頂層類
在 .java
文件中,允許多個頂層類併列存在,但只能有一個與其文件名同名的、聲明為 public
的頂層類。這個與文件名同名的頂層類可以聲明為包私有的,但在這個文件中的其他頂層類只能聲明為包私有的。
1 /** 2 * 定義一個頂層類。 3 */ 4 public class TopLevelClass { 5 public static void main(String[] args) { 6 System.out.println("TopLevelClass:這是與 TopLevelClass.java 文件同名的頂層類。"); 7 System.out.println(new AnotherClass().toString()); 8 } 9 } 10 11 /** 12 * 定義另一個頂層類。 13 */ 14 class AnotherClass { 15 public AnotherClass() { 16 } 17 18 @Override 19 public String toString() { 20 return "AnotherClass:這是在 TopLevelClass.java 文件中的另一個頂層類。"; 21 } 22 } 23 /* 輸出結果: 24 TopLevelClass:這是與 TopLevelClass.java 文件同名的頂層類。 25 AnotherClass:這是在 TopLevelClass.java 文件中的另一個頂層類。 26 27 */
在上述示例中,若將 AnotherClass 類聲明為 public
,則 Java 編譯器將會生成一條類似於“類 AnotherClass 是公共的,應在名為 AnotherClass.java 的文件中聲明
”的錯誤消息。
聲明抽象類
可以使用 abstract
關鍵字,將頂層類聲明為抽象類,如下:
1 public class AbstractClassDemo { 2 public static void main(String[] args) { 3 new Subclass().printName(); 4 } 5 } 6 7 /** 8 * 定義一個抽象類。 9 */ 10 abstract class AbstractClass { 11 private final String name; 12 13 // 定義抽象類的構造方法。 14 public AbstractClass() { 15 name = "AbstractClass:這是一個抽象類。"; 16 } 17 18 // 定義一個非抽象方法。 19 public String getName() { 20 return name; 21 } 22 23 // 定義一個抽象方法。 24 public abstract void printName(); 25 } 26 27 /** 28 * 定義一個子類。 29 */ 30 class Subclass extends AbstractClass { 31 private final String name; 32 33 // 定義子類的構造方法。 34 public Subclass() { 35 super(); 36 name = "Subclass:這是一個抽象類的子類。"; 37 } 38 39 // 實現父類的抽象方法。 40 @Override 41 public void printName() { 42 System.out.println(super.getName()); 43 System.out.println(name); 44 } 45 } 46 /* 輸出結果: 47 AbstractClass:這是一個抽象類。 48 Subclass:這是一個抽象類的子類。 49 50 */
想要瞭解有關抽象類的更多信息,請參閱《抽象類》。