1. 程式人生 > >5 . 2 . 4 p r o t e c t e d:“友好的一種”

5 . 2 . 4 p r o t e c t e d:“友好的一種”

protected(受到保護的)訪問指示符要求大家提前有所認識。首先應注意這樣一個事實:為繼續學習本書一
直到繼承那一章之前的內容,並不一定需要先理解本小節的內容。但為了保持內容的完整,這兒仍然要對此
進行簡要說明,並提供相關的例子。
protected 關鍵字為我們引入了一種名為“繼承”的概念,它以現有的類為基礎,並在其中加入新的成員,
同時不會對現有的類產生影響——我們將這種現有的類稱為“基礎類”或者“基本類”(Base Class)。亦
可改變那個類現有成員的行為。對於從一個現有類的繼承,我們說自己的新類“擴充套件”(extends)了那個現
有的類。如下所示:
class Foo extends Bar {
類定義剩餘的部分看起來是完全相同的。
若新建一個包,並從另一個包內的某個類裡繼承,則唯一能夠訪問的成員就是原來那個包的public 成員。當
然,如果在相同的包裡進行繼承,那麼繼承獲得的包能夠訪問所有“友好”的成員。有些時候,基礎類的創
建者喜歡提供一個特殊的成員,並允許訪問衍生類。這正是protected 的工作。若往回引用5.2.2 小節
“public:介面訪問”的那個Cookie.java 檔案,則下面這個類就不能訪問“友好”的成員:
//: ChocolateChip.java
// Can't access friendly member
// in another class
import c05.dessert.*;
public class ChocolateChip extends Cookie {
public ChocolateChip() {
System.out.println(
"ChocolateChip constructor");
}
public static void main(String[] args) {
ChocolateChip x = new ChocolateChip();
//! x.foo(); // Can't access foo
}
} ///:~
對於繼承,值得注意的一件有趣的事情是倘若方法foo()存在於類Cookie 中,那麼它也會存在於從Cookie
繼承的所有類中。但由於foo()在外部的包裡是“友好”的,所以我們不能使用它。當然,亦可將其變成
public。但這樣一來,由於所有人都能自由訪問它,所以可能並非我們所希望的局面。若象下面這樣修改類
Cookie:
public class Cookie {
134
public Cookie() {
System.out.println("Cookie constructor");
}
protected void foo() {
System.out.println("foo");
}
}
那麼仍然能在包dessert 裡“友好”地訪問foo(),但從Cookie 繼承的其他東西亦可自由地訪問它。然而,
它並非公共的(public)。