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

Java public 關鍵字與預設套件機制:公開介面設計與跨檔案存取規則

     編輯:Java 相關知識

public 是 Java 最開放的存取層級:標記為 public 的類別、方法、欄位,**所有類別**(跨套件、跨模組)皆可存取。本文將詳細說明 public 類別的三大鐵律、套件匯入機制,以及「預設套件」這個特殊且常被忽視的跨檔案存取規則。

public 類別:對外公開的契約

在類別定義前加上 public:

package c05.dessert;

public class Cookie {
    public Cookie() { System.out.println("Cookie constructor"); }
    void foo() { System.out.println("foo"); }  // package-private
}

三大鐵律(違反即編譯錯誤)

  1. 單一 public 類別:每個 .java 檔案最多**一個** public 類別
  2. 檔名完全匹配:public class Widget → 檔名必須為 Widget.java(含大小寫)
  3. 代表編譯單元公共介面:該類別是此檔案對外唯一的進入點

套件匯入與存取示範

外部程式碼欲使用 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。成員存取層級獨立決定。

CLASSPATH 與目錄結構要求

  • 原始碼目錄結構必須對應套件名:c05/dessert/Cookie.java
  • 編譯/執行時 CLASSPATH 需包含 c05 的**父目錄**
  • Java **不自動**將當前目錄加入搜尋路徑,除非 CLASSPATH 含 .

預設套件:無 package 宣告的特殊行為

若原始碼**未宣告 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+ 模組系統要求所有類別必須在具名套件
命名衝突風險專案增大時,不同目錄的預設套件類別可能衝突
專業專案禁用正式專案**強制要求**所有類別宣告具名套件

實務建議

  1. 永遠宣告 package:哪怕是練習,也用 package practice.ch01; 等具名套件
  2. public 類別獨佔一檔:檔名 = 類別名,便於導航與建構
  3. 成員預設 package-private:只有真正對外契約才加 public
  4. 理解「類別 public ≠ 成員 public」:分別決策,精準控制可見性

總結

public 類別是模組對外的「大門」,受嚴格檔案命名與單一性約束。預設套件雖方便初學,但屬於「非標準行為」,正式開發必須棄用。掌握這些規則,能避免大量莫名其妙的編譯錯誤,建立結構清晰、可擴展的專案架構。

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