為了實現面向對象程式設計(OOP)的封裝這個特性,需要程式設計語言提供一定的語法機制來支持。這個語法機制就是訪問許可權控制(訪問修飾符:public、protected、private、default)。 ...
為了實現面向對象程式設計(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 受保護訪問
本文來自博客園,作者:真正的飛魚,轉載請註明原文鏈接:https://www.cnblogs.com/feiyu2/p/17320472.html