※ 引述《lovdkkkk (dk)》之銘言:
: 意思是 call 自己的與 invoke 別人的的差別?
: 如果這是主因,而和 Test 是不是自己的 subclass 無關的話...
: 這樣去想感覺有點更複雜,先暫停 XDD
: (super.protectedMethod 之類...
: 痾,暫停暫停)
: 總之,受教了。
我其實還蠻苦惱的,因為 protected 與 package default 修飾詞的差別對不少人
來說是模糊的(這包括那些可以說出「 protected 就是比 package default 多了在
subclass 可以用」的人),但是我尚未發現一個比較能夠讓人了解的說法。
或許這是我最後一次嘗試了,不以文字敘事為主的說明方式,而是以比較完整卻
又不是非常複雜的表列方式,來揭露 protected 與 package default 的差異。
首先假設有一個 class C 屬於 package P。
為了單純,由 class A 可以 access 到 class B 的那些 memeber,構成 B
對 A 的界面(就是 A 看 B 時能看到的東西),凡是 class A 面對 B 時所無法
存取到的(不管編譯器抱怨的理由是什麼),就不屬於 B 對 A 的界面。
那麼下表一,橫列是定義於 C 的 member。
縱軸是 C 對各種類型的 class 的界面是否包含橫列所示的 member。
#表一
member defined in C
public package protected private
====================================================================
class C O O O O
class other than C O O O X
in P
class other than C O X X X
NOT in P
class derived from C O O O X
in P
class derived from C O X X X
NOT in P
這部分應該是為人熟悉的:因為標的物是定義 member 的 class C,所以 protected
與 package default 是完全相同的。
接著假設有個 class D extends C in P,class E extends C NOT in P
(p.D extends p.C, q.E extends p.C)
#表二 針對 class D 對左列類型所透露出的界面
member defined in C
public package protected private
====================================================================
class D O O O X
class other than D O O O X
in P
class other than D O X X X
NOT in P
class derived from D O O O X
in P
class derived from D O X X X
NOT in P
protected 與 package default 的作用依然無差別,因為 subclass D 與 C 同在 P,
"繼承"造成的影響被 package default 的影響覆蓋。
另,除了 private 在繼承方面起了作用外,表二與表一是一樣的。
#表三 針對 class E 對左列類型所透露出的界面
member defined in C
public package protected private
====================================================================
class E O X O X
class other than E O X O X
in P
class other than E O X X X
NOT in P
class derived from E O X O X
in P
class derived from E O X X X
NOT in P
這裡顯露出 protected/package default 的差別,當 subclass E 不在 package P
中,protected 跳出 package default 的涵蓋範圍,得顯露出其獨特的影響力。
我前一篇提到把 protected member 看成可透過繼承而視同定義在 subclass 的
看法,對許多人而言是比較容易去理解與接受的,但是他的缺點是抱持這種觀點者,
實不容易正確寫出表二、表三。