Java 教程
很多介紹Java語言的書籍(包括《Java編程思想》)都對protected介紹的比較的簡單,基本都是一句話,就是: 被 protected 修飾的成員對于本包和其子類可見。這種說法有點(diǎn)太過含糊,常常會對大家造成誤解。實(shí)際上,protected的可見性在于兩點(diǎn):
- 基類的 protected 成員是包內(nèi)可見的,并且對子類可見;
- 若子類與基類不在同一包中,那么在子類中,子類實(shí)例可以訪問其從基類繼承而來的protected方法,而不能訪問基類實(shí)例的protected方法。
我們可以通過以下幾個關(guān)于protected方法可見性的例子來進(jìn)一步掌握protected關(guān)鍵字。在碰到涉及protected成員的調(diào)用時,首先要確定出該protected成員來自何方,其可見性范圍是什么,然后就可以判斷出當(dāng)前用法是否可行了,看下面七個例子:
對于上面的示例,首先看(1)(3),其中的f()方法從類Father1繼承而來,其可見性是包p1及其子類Son1和Son11,而由于調(diào)用f()方法的類Test1所在的包也是p1,因此(1)(3)處編譯通過。其次看(2)(4),其中的clone()方法的可見性是java.lang包及其所有子類,對于語句"son1.clone();"和"son11.clone();",二者的clone()在類Son1、Son11中是可見的,但對Test1是不可見的,因此(2)(4)處編譯不通過。
對于(1)而言,clone()方法來自于類MyObject2本身,因此其可見性為包p2及MyObject2的子類,雖然Test2是MyObject2的子類,但在Test2中不能訪問基類MyObject2的protected方法clone(),因此編譯不通過;對于(2)而言,由于在Test2中訪問的是其本身實(shí)例的從基類MyObject2繼承來的的clone(),因此編譯通過。
對于(1)而言,clone()方法來自于類Test3,因此其可見性為包p33及其子類MyObject3,而(1)正是在p33的類Test3中調(diào)用,屬于同一包,編譯通過。
對于(1)而言,clone()方法來自于類MyObject4,因此其可見性為包p4及其子類(此處沒有子類),而類Test4卻在包p44中,因此不滿足可見性,編譯不通過。
對于(1)而言,clone()方法來自于類MyObject5,因此其可見性為包p5及其子類(此處沒有子類),而類Test5也在包p5中,因此滿足可見性,編譯通過。
對于(1)而言,clone()方法來自于類Test6,因此其可見性為包p6及其子類MyObject6,而類Test6也在包p6中,因此滿足可見性,編譯通過。
對于(1)而言,clone()方法來自于類Object,因此該clone()方法可見性為包java.lang及其子類Test7,由于類MyObject7不在此范圍內(nèi),因此不滿足可見性,編譯不通過。
文章來源:http://blog.csdn.net/justloveyou_/article/details/61672133