首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Java public class 與 class 差異深度解析:編譯規則與執行機制

     編輯:Java 程式設計入門

核心規則對比

特性public classclass (package-private)
檔名限制必須與類名完全一致可與檔名不同
每檔案數量最多一個可多個
可見性全專案可存取同套件內可存取
編譯產物同名 .class各自類名 .class

錯誤實戰:public class 檔名不符

檔案:Hello.java


public class HelloDemo { // 錯誤:類名 != 檔名
    public static void main(String[] args) {
        System.out.println("HelloWorld!!!");
    }
}

編譯錯誤


Hello.java:1: 錯誤: 類 HelloDemo 是公共的,應在名為 HelloDemo.java 的檔案中聲明
public class HelloDemo {
       ^
1 個錯誤

正確寫法對照

情況 A:public class(單檔單類)


// 檔名:HelloDemo.java
public class HelloDemo {
    public static void main(String[] args) {
        System.out.println("HelloWorld!!!");
    }
}
// 編譯:javac HelloDemo.java
// 執行:java HelloDemo

情況 B:class(單檔多類)


// 檔名: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 (注意:執行類名,非檔名)

深度原理:為什麼有這限制?

  1. 編譯器效率: 公開類為進入點,檔名對應可讓編譯器快速定位,無需掃描所有檔案
  2. 類載入器契約: ClassLoader.loadClass("HelloDemo") 慣例對應 HelloDemo.class 檔案
  3. 封裝邊界: public 代表對外契約,強制一對一管理;包私有類為內部實現細節,允許聚合

最佳實踐建議

  1. 公開 API 類: 獨立檔案,public class,檔名同類名
  2. 內部輔助類: 同檔案內用 class(包私有)或 private static class(巢狀類)
  3. 測試類: 可同檔案多 class,或獨立 public class 放在 test 目錄
  4. 避免: 同檔案多 public class(編譯直接報錯)

執行時驗證


# 情況 B 編譯後
ls *.class
# HelloDemo.class  A.class  B.class

# 執行
java HelloDemo
# HelloWorld!!!

# 錯誤嘗試
java Hello
# 錯誤: 找不到或無法載入主類 Hello

關鍵: java 後接的是完整類名(含包名),而非檔名。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved