最好將類中的字段標記爲 private,而方法標記爲 public。任何聲明爲 private 的內容對其餘類都是不可見的。這對子類來講也徹底適用,即子類也不能訪問超類的私有字段。java
Java 中的受保護部分對全部子類及同一個包中的全部其餘類均可見。程序員
有時候可能但願限制超類中的某個方法只容許子類訪問,或者容許子類的方法訪問超類的某個字段。須要將這些類方法或字段聲明爲受保護(protected)。例如,若是將超類 Employee 中的 hireDay 字段聲明爲 protected,而不是 private,Manager 類的方法就能夠直接訪問這個字段。ide
Employee 類設計
public class Employee { // 聘用日期 protected LocalDate hireDay; ... }
Employee 類的子類們:code
public class Manager extends Employee {...} public class Programmer extends Employee {...}
在 Java 中,對象的保護字段只能由同一個包中的類訪問。如今考慮一個 Programmer 子類,這個子類在另外一個不一樣的包中。Programmer 類中的方法只能查看 Programmer 對象本身的 hireDay 字段,而不能查看其它 Employee 對象的這個字段。有了這個限制,就能避免濫用保護機制,不能經過派生子類的對象來訪問超類對象的受保護的字段。對象
在實際應用中,要謹慎使用受保護字段。假設你的類要提供給其餘程序員使用,而你在設計這個類時設置了一些受保護字段。你不知道的是,其餘程序員可能會由這個類再派生出新類,並開始訪問你的受保護字段。在這種狀況下,若是你想修改你的類的實現,就勢必會影響那些程序員。這違背了 OOP 提倡數據封裝的精神。it
受保護的方法更具備實際意義。若是須要限制某個方法的使用,就能夠將它聲明爲 protected。這代表子類(可能很熟悉祖先類)獲得了信任,能夠正確地使用這個方法,而其餘類則不行。
這種方法的一個很好示例就是 Object 類中的 clone 方法。io
public class Object { @HotSpotIntrinsicCandidate protected native Object clone() throws CloneNotSupportedException; }