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