溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

protected怎么在Java中使用

發(fā)布時(shí)間:2021-01-14 14:37:25 來源:億速云 閱讀:475 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了protected怎么在Java中使用,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

權(quán)限控制表

修飾詞本類同一個(gè)包的類繼承類其他類
private×××
無(默認(rèn))××
protected×
public

關(guān)于protected

最近在看Effective Java時(shí),遇到了一個(gè)關(guān)于protected修飾符的問題。這個(gè)問題中,對(duì)于它的認(rèn)識(shí)與我之前對(duì)它的認(rèn)識(shí)有一些出入。所以在這里記錄一下。

很多介紹Java語言的書籍(包括《Java編程思想》)都對(duì)protected介紹的比較的簡(jiǎn)單,基本都是一句話,就是:被protected修飾的成員對(duì)于本包和其子類可見。這種說法有點(diǎn)太過含糊,常常會(huì)對(duì)大家造成誤解。實(shí)際上,protected的可見性在于兩點(diǎn):

  • 父類的protected成員是包內(nèi)可見的,并且對(duì)子類可見;

  • 若子類與父類不在同一包中,那么在子類中,子類實(shí)例可以訪問其從父類繼承而來的protected方法,而不能訪問父類實(shí)例的protected方法

在碰到涉及protected成員的調(diào)用時(shí),首先要確定出該protected成員來自何方,其可見性范圍是什么,然后就可以判斷出當(dāng)前用法是否可行。

這里有一個(gè)疑問就是上述結(jié)論的第二點(diǎn)。咋一看是比較繞口的,甚至有點(diǎn)矛盾,但是在看了下面的幾個(gè)例子之后,理解就會(huì)更加深一點(diǎn)。

示例一

p1/Father1.java

package basic.testprotected.p1;

public class Father1 {
 protected void f() {} // 父類Father1中的protected方法
}

p1/Son1.java

package basic.testprotected.p1;

public class Son1 extends Father1{}

p11/Son11.java

package basic.testprotected.p11;

import basic.testprotected.p1.Father1;

public class Son11 extends Father1{}

p1/Test1.java

protected怎么在Java中使用

首先看(1)(3),其中的f()方法從類Father1繼承而來,其可見性是包p1及其子類Son1和Son11,而由于調(diào)用f()方法的類Test1所在的包也是p1,因此(1)(3)處編譯通過。也就是說,如果我們換一個(gè)包,比如Test11.java在p11下,那么將都不可訪問。如下:

protected怎么在Java中使用

其次看(2)(4),其中的clone()方法的可見性是java.lang包及其所有子類,對(duì)于語句son1.clone();son11.clone();,二者的clone()在類Son1、Son11中是可見的,但對(duì)Test1是不可見的,因此(1)(3)處編譯不通過。也就是說,如果在Son1或Son11這兩個(gè)類中調(diào)用clone()方法,則是可以編譯通過的。

protected怎么在Java中使用 

其實(shí)到此,我所遇到的問題已基本解決。因?yàn)槲矣龅降那闆r和這里的示例代碼是一模一樣的。

示例二

p2/MyObject2.java

package basic.testprotected.p2;

public class MyObject2 {
 protected Object clone() throws CloneNotSupportedException{
 return super.clone();
 }
}

p22/Test2.java

protected怎么在Java中使用 

對(duì)于(1)而言,clone()方法來自于類MyObject2本身,因此其可見性為包p2及MyObject2的子類,雖然Test2是MyObject2的子類,但在Test2中不能訪問父類MyObject2的protected方法clone(),因此編譯不通過;對(duì)于(2)而言,由于在Test2中訪問的是其本身實(shí)例的從父類MyObject2繼承來的的clone(),因此編譯通過。所以在這里,就很好地闡述了上面所給的第二條結(jié)論:

若子類與父類不在同一包中,那么在子類中,子類實(shí)例可以訪問其從父類繼承而來的protected方法,而不能訪問父類實(shí)例的protected方法。

為什么要這樣以及這樣要如何解釋呢?

我想這可能需要思考一下對(duì)子類可見的定義。先加一個(gè)構(gòu)造函數(shù),在這個(gè)構(gòu)造函數(shù)里面,可以訪問clone方法,這個(gè)方法來自MyObject2

protected怎么在Java中使用 

所以,再寫一個(gè)類Test22繼承自MyObject2,然后重新寫個(gè)方法testSuperClone(),如下:

protected怎么在Java中使用 

感覺這兩個(gè)之間還是存在一些差距。所以,我的不太恰當(dāng)理解為:對(duì)子類的實(shí)例可見,即可以在子類中,通過子類的實(shí)例去訪問相應(yīng)的protected方法。

示例三

p3/MyObject3.java

package basic.testprotected.p3;

import basic.testprotected.p33.Test3;

public class MyObject3 extends Test3 {}

p33/Test3.java

protected怎么在Java中使用 

對(duì)于(1)而言,clone()方法來自于類Test3,因此其可見性為包p33及其子類MyObject3,而(1)正是在p33的類Test3中調(diào)用,屬于同一包,編譯通過。

示例四

p4/MyObject4.java

package basic.testprotected.p4;

import basic.testprotected.p44.Test4;

public class MyObject4 extends Test4 {
 protected Object clone() throws CloneNotSupportedException {
 return super.clone();
 }
}

p44/Test4.java

protected怎么在Java中使用 

對(duì)于(1)而言,clone()方法來自于類MyObject4,因此其可見性為包p4及其子類(此處沒有子類),而類Test4卻在包p44中,因此不滿足可見性,編譯不通過。

示例五

p5/MyObject5.java

package basic.testprotected.p5;

public class MyObject5 {
 protected Object clone() throws CloneNotSupportedException{
 return super.clone();
 }
}

p5/Test5.java

protected怎么在Java中使用 

對(duì)于(1)而言,clone()方法來自于類MyObject5,因此其可見性為包p5及其子類(此處沒有子類),而類Test5也在包p5中,因此滿足可見性,編譯通過。

示例六

package p6;

class MyObject6 extends Test6{}

public class Test6 {
 public static void main(String[] args) {
 MyObject6 obj = new MyObject6();
 obj.clone(); // Compile OK -------(1)
 }
}

對(duì)于(1)而言,clone()方法來自于類Test6,因此其可見性為包p6及其子類MyObject6,而類Test6也在包p6中,因此滿足可見性,編譯通過。

示例七

package p7;

class MyObject7 extends Test7 {
 public static void main(String[] args) {
 Test7 test = new Test7();
 test.clone(); // Compile Error ----- (1)
 }
}

public class Test7 {
}

對(duì)于(1)而言,clone()方法來自于類Object,因此該clone()方法可見性為包java.lang及其子類Test7,由于類MyObject7不在此范圍內(nèi),因此不滿足可見性,編譯不通過。

上述內(nèi)容就是protected怎么在Java中使用,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI