頂層類
出自 MBA智库百科(https://wiki.mbalib.com/)
2025 年 12 月 5 日 星期五
|
目錄 |
頂層類(Top-level class),是 Java 中對類的一種定義方式。在 .java 文件中,處於最外層的類就稱為頂層類,在其外部不存在將其包圍起來的任何代碼塊。下麵的示例就是一個典型的頂層類:
/**
* 定義一個公共的頂層類。
*/
public class MyClass {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
/* 輸出結果:
Hello World!
*/
頂層類可聲明為 public,如前面示例中的 MyClass 類,也可聲明為包私有的,如下:
/**
* 定義一個包私有的頂層類。
*/
class PackagePrivateClass {
public static void main(String[] args) {
System.out.println("PackagePrivateClass:這是一個包私有的頂層類。");
}
}
/* 輸出結果:
PackagePrivateClass:這是一個包私有的頂層類。
*/
不允許將頂層類聲明為 private 或 protected,因為頂層類在本質上不屬於私密類。如果將一個頂層類用 private 或 protected 關鍵字隱藏起來(即不對外共用),那就無法創建這個類的實例,等同於沒有定義這個類。
此外,不允許將頂層類聲明為 static,因為頂層類在本質上是非靜態的,只有在創建其實例時,才會將其載入到記憶體中。否則,Java 編譯器將會生成一條類似於“此處不允許使用修飾符 static”的錯誤消息。
在 .java 文件中,允許多個頂層類併列存在,但只能有一個與其文件名同名的、聲明為 public 的頂層類。這個與文件名同名的頂層類可聲明為包私有的,但在這個文件中的其他頂層類只能聲明為包私有的。
/**
* 定義一個頂層類。
*/
public class TopLevelClass {
public static void main(String[] args) {
System.out.println("TopLevelClass:這是與 TopLevelClass.java 文件同名的頂層類。");
System.out.println(new AnotherClass().toString());
}
}
/**
* 定義另一個頂層類。
*/
class AnotherClass {
public AnotherClass() {
}
@Override
public String toString() {
return "AnotherClass:這是在 TopLevelClass.java 文件中的另一個頂層類。";
}
}
/* 輸出結果:
TopLevelClass:這是與 TopLevelClass.java 文件同名的頂層類。
AnotherClass:這是在 TopLevelClass.java 文件中的另一個頂層類。
*/
在上述示例中,若將 AnotherClass 類聲明為 public,則 Java 編譯器將會生成一條類似於“類 AnotherClass 是公共的,應在名為 AnotherClass.java 的文件中聲明”的錯誤消息。
可使用 abstract 關鍵字,將頂層類聲明為抽象類,如下:
public class AbstractClassDemo {
public static void main(String[] args) {
new Subclass().printName();
}
}
/**
* 定義一個抽象類。
*/
abstract class AbstractClass {
private final String name;
// 定義抽象類的構造方法。
public AbstractClass() {
name = "AbstractClass:這是一個抽象類。";
}
// 定義一個非抽象方法。
public String getName() {
return name;
}
// 定義一個抽象方法。
public abstract void printName();
}
/**
* 定義一個子類。
*/
class Subclass extends AbstractClass {
private final String name;
// 定義子類的構造方法。
public Subclass() {
super();
name = "Subclass:這是一個抽象類的子類。";
}
// 實現父類的抽象方法。
@Override
public void printName() {
System.out.println(super.getName());
System.out.println(name);
}
}
/* 輸出結果:
AbstractClass:這是一個抽象類。
Subclass:這是一個抽象類的子類。
*/


