Java | 頂層類 Top-Level Class


頂層類

前言


本文內容根據 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 關鍵字前不加 publicprivateprotected 關鍵字,那么這個類就聲明為包私有的(Package-Private),即它是類的默認聲明。包私有的類可在其所在的包內共享,但不能跨包共享。

不允許將頂層類聲明為 privateprotected,因為頂層類在本質上不屬於私密類。如果將一個頂層類用 privateprotected 關鍵字隱藏起來(即不對外共享),那就無法創建這個類的實例,等同於沒有定義這個類。

此外,不允許將頂層類聲明為 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  */

想要了解有關抽象類的更多信息,請參閱《抽象類》。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM