public 是 Java 最開放的存取層級:標記為 public 的類別、方法、欄位,**所有類別**(跨套件、跨模組)皆可存取。本文將詳細說明 public 類別的三大鐵律、套件匯入機制,以及「預設套件」這個特殊且常被忽視的跨檔案存取規則。
在類別定義前加上 public:
package c05.dessert;
public class Cookie {
public Cookie() { System.out.println("Cookie constructor"); }
void foo() { System.out.println("foo"); } // package-private
}
.java 檔案最多**一個** public 類別public class Widget → 檔名必須為 Widget.java(含大小寫)外部程式碼欲使用 Cookie:
// Dinner.java
import c05.dessert.*; // 或 import c05.dessert.Cookie;
public class Dinner {
public static void main(String[] args) {
Cookie x = new Cookie(); // 合法:public 類別 + public 建構子
// x.foo(); // 編譯錯誤:foo() 是 package-private,跨套件不可見
}
}
關鍵點:public 類別不代表其所有成員都是 public。成員存取層級獨立決定。
c05/dessert/Cookie.javaCLASSPATH 需包含 c05 的**父目錄**CLASSPATH 含 .若原始碼**未宣告 package**,該檔案屬於「預設套件」。同目錄下所有無套件宣告的檔案,**互視為同一套件**,享有 package-private 存取權:
// Cake.java (無 package 宣告)
class Cake {
public static void main(String[] args) {
Pie x = new Pie(); // 合法!同預設套件
x.f();
}
}
// Pie.java (無 package 宣告,同目錄)
class Pie {
void f() { System.out.println("Pie.f()"); } // package-private
}
這解釋了早期練習為何能跨檔案直接存取類別:它們隱性屬於同一預設套件。
| 限制 | 說明 |
|---|---|
| 無法被具名套件匯入 | import 無法引用預設套件類別 |
| 模組系統不支援 | Java 9+ 模組系統要求所有類別必須在具名套件 |
| 命名衝突風險 | 專案增大時,不同目錄的預設套件類別可能衝突 |
| 專業專案禁用 | 正式專案**強制要求**所有類別宣告具名套件 |
package practice.ch01; 等具名套件publicpublic 類別是模組對外的「大門」,受嚴格檔案命名與單一性約束。預設套件雖方便初學,但屬於「非標準行為」,正式開發必須棄用。掌握這些規則,能避免大量莫名其妙的編譯錯誤,建立結構清晰、可擴展的專案架構。