最好將類(lèi)中的字段標(biāo)記為 private踏志,而方法標(biāo)記為 public阀捅。任何聲明為 private 的內(nèi)容對(duì)其他類(lèi)都是不可見(jiàn)的。這對(duì)子類(lèi)來(lái)說(shuō)也完全適用针余,即子類(lèi)也不能訪問(wèn)超類(lèi)的私有字段也搓。
Java 中的受保護(hù)部分對(duì)所有子類(lèi)及同一個(gè)包中的所有其他類(lèi)都可見(jiàn)。
有時(shí)候可能希望限制超類(lèi)中的某個(gè)方法只允許子類(lèi)訪問(wèn)涵紊,或者允許子類(lèi)的方法訪問(wèn)超類(lèi)的某個(gè)字段。需要將這些類(lèi)方法或字段聲明為受保護(hù)(protected)幔摸。例如摸柄,如果將超類(lèi) Employee 中的 hireDay 字段聲明為 protected,而不是 private既忆,Manager 類(lèi)的方法就可以直接訪問(wèn)這個(gè)字段驱负。
Employee 類(lèi)
public class Employee {
// 聘用日期
protected LocalDate hireDay;
...
}
Employee 類(lèi)的子類(lèi)們:
public class Manager extends Employee {...}
public class Programmer extends Employee {...}
在 Java 中,對(duì)象的保護(hù)字段只能由同一個(gè)包中的類(lèi)訪問(wèn)』脊停現(xiàn)在考慮一個(gè) Programmer 子類(lèi)跃脊,這個(gè)子類(lèi)在另一個(gè)不同的包中。Programmer 類(lèi)中的方法只能查看 Programmer 對(duì)象自己的 hireDay 字段苛吱,而不能查看其它 Employee 對(duì)象的這個(gè)字段酪术。有了這個(gè)限制,就能避免濫用保護(hù)機(jī)制翠储,不能通過(guò)派生子類(lèi)的對(duì)象來(lái)訪問(wèn)超類(lèi)對(duì)象的受保護(hù)的字段绘雁。
在實(shí)際應(yīng)用中,要謹(jǐn)慎使用受保護(hù)字段援所。假設(shè)你的類(lèi)要提供給其他程序員使用庐舟,而你在設(shè)計(jì)這個(gè)類(lèi)時(shí)設(shè)置了一些受保護(hù)字段。你不知道的是住拭,其他程序員可能會(huì)由這個(gè)類(lèi)再派生出新類(lèi)挪略,并開(kāi)始訪問(wèn)你的受保護(hù)字段历帚。在這種情況下,如果你想修改你的類(lèi)的實(shí)現(xiàn)杠娱,就勢(shì)必會(huì)影響那些程序員挽牢。這違背了 OOP 提倡數(shù)據(jù)封裝的精神。
受保護(hù)的方法更具有實(shí)際意義墨辛。如果需要限制某個(gè)方法的使用卓研,就可以將它聲明為 protected。這表明子類(lèi)(可能很熟悉祖先類(lèi))得到了信任睹簇,可以正確地使用這個(gè)方法奏赘,而其他類(lèi)則不行。
這種方法的一個(gè)很好示例就是 Object 類(lèi)中的 clone 方法太惠。
public class Object {
@HotSpotIntrinsicCandidate
protected native Object clone() throws CloneNotSupportedException;
}