Java的訪問修飾符

真正的飛魚發表於2023-04-15

為了實現物件導向程式設計(OOP)的封裝這個特性,需要程式設計語言提供一定的語法機制來支援。這個語法機制就是訪問許可權控制(訪問修飾符:public、protected、private、default)。

在 Java 中,封裝就意味著所有的例項域都帶有 private 訪問修飾符(私有的例項域),並提供帶有 public 訪問修飾符的域訪問器方法和域更改器方法(公共的操作方法)。

訪問修飾符

下面歸納一下 Java 用於控制可見性的 4 個訪問修飾符:

  • public:宣告為 public 的內容對所有類可見。
  • protected:宣告為 protected 的內容對所有子類和同一個包中的所有其他類可見。
  • private:宣告為 private 的內容僅對本類可見。對其他類都是不可見的,這對於子類來說也完全適用,即子類也不能訪問父類的私有域。
  • 預設(無訪問修飾符):無訪問修飾符的內容對同一個包中的所有其他類可見。

Java 中的受保護部分(protected)對所有子類及同一個包中的所有其他類都可見。這與 C++ 中的保護機制稍有不同,Java 中的 protected 概念要比 C++ 中的安全性差。


訪問修飾符用來修飾類,及類的內部結構

  • 修飾類,只能用:public、預設
  • 修飾類的內部結構(屬性、方法、構造器、內部類),可以用:public、protected、private、預設 修飾

受訪問保護

大家都知道,最好將類中的域標記為 private,而將方法標記為 public。任何宣告為 private 的內容對其他類都是不可見的,這對於子類來說也完全適用,即子類也不能訪問父類的私有域。

然而,在有些時候,人們希望父類中的某些方法允許被子類訪問,或者允許子類的方法訪問父類的某個域。為此,需要將這些方法或域宣告為 protected。例如,如果將父類 Employee 中的 hireDay 宣告為 proteced,而不是私有的,Manager 中的方法就可以直接地訪問它。

不過,Manager 類中的方法只能夠訪問 Manager 物件中的 hireDay 域,而不能訪問其他 Employee 物件中的這個域。這種限制有助於避免濫用受保護機制,使得子類只能獲得訪問受保護域的權利。

在實際應用中,要謹慎使用 protected 屬性。假設需要將設計的類提供給其他程式設計師使用,而在這個類中設定了一些受保護域,由於其他程式設計師可以由這個類再派生出新類,並訪問其中的受保護域。在這種情況下,如果需要對這個類的實現進行修改,就必須通知所有使用這個類的程式設計師。這違背了 OOP 提倡的資料封裝原則。

受保護的方法更具有實際意義。

  • 如果需要限制某個方法的使用,就可以將該方法宣告為 protected。這表明子類(可能很熟悉祖先類)得到信任,可以正確地使用這個方法,而其他類則不行。這種方法的一個最好的示例就是 Object 類中的 clone 方法。
  • protected 方法對於指示那些不提供一般用途而應在子類中重新定義的方法很有用。

參考資料

《Java核心技術卷一:基礎知識》(第10版)第 5 章:繼承 5.1.10 受保護訪問

相關文章