| 特性 | public class | class (package-private) |
|---|---|---|
| 檔名限制 | 必須與類名完全一致 | 可與檔名不同 |
| 每檔案數量 | 最多一個 | 可多個 |
| 可見性 | 全專案可存取 | 同套件內可存取 |
| 編譯產物 | 同名 .class | 各自類名 .class |
public class HelloDemo { // 錯誤:類名 != 檔名
public static void main(String[] args) {
System.out.println("HelloWorld!!!");
}
}
Hello.java:1: 錯誤: 類 HelloDemo 是公共的,應在名為 HelloDemo.java 的檔案中聲明
public class HelloDemo {
^
1 個錯誤
// 檔名:HelloDemo.java
public class HelloDemo {
public static void main(String[] args) {
System.out.println("HelloWorld!!!");
}
}
// 編譯:javac HelloDemo.java
// 執行:java HelloDemo
// 檔名:Hello.java
class HelloDemo {
public static void main(String[] args) {
System.out.println("HelloWorld!!!");
}
}
class A {}
class B {}
// 編譯:javac Hello.java
// 產生:HelloDemo.class、A.class、B.class
// 執行:java HelloDemo (注意:執行類名,非檔名)
ClassLoader.loadClass("HelloDemo") 慣例對應 HelloDemo.class 檔案public 代表對外契約,強制一對一管理;包私有類為內部實現細節,允許聚合public class,檔名同類名class(包私有)或 private static class(巢狀類)class,或獨立 public class 放在 test 目錄public class(編譯直接報錯)
# 情況 B 編譯後
ls *.class
# HelloDemo.class A.class B.class
# 執行
java HelloDemo
# HelloWorld!!!
# 錯誤嘗試
java Hello
# 錯誤: 找不到或無法載入主類 Hello
關鍵: java 後接的是完整類名(含包名),而非檔名。