基于Java protected的深入理解
更新時間:2013年06月04日 16:24:32 作者:
本篇文章是對Java protected進行了詳細的分析介紹,需要的朋友參考下
一提到訪問控制符protected,即使是初學(xué)者一般都會很自信的認為自己在這方面的理解沒有問題。那好,我們提一個問題出來看看.....
請看下面兩端代碼,其中包B中的貓和鼠都繼承了動物類。
//代碼1:包A中有一個動物類
package testa;
public class Animal {
protected void crowl(String c){
System.out.println(c);
}
}
//代碼2:包B中有兩個類——貓類和鼠類
package testb;
import testa.Animal;
class Cat extends Animal{
}
class Rat extends Animal{
public void crowl(){
crowl("zhi zhi"); //沒有問題,繼承了Animal中的protected方法——crowl(String)
Cat cat=new Cat();
cat.crowl("miao miao"); //wrong, The method crowl(String) from the type Animal is not visible
}
}
既然,貓和鼠都繼承了動物類,那么在鼠類的作用范圍內(nèi),看不到貓所繼承的crowl()方法呢?
癥結(jié)所在:
protected受訪問保護規(guī)則是很微妙的。雖然protected域?qū)λ凶宇惗伎梢姟5怯幸稽c很重要,子類只能在自己的作用范圍內(nèi)訪問自己繼承的那個父類protected域,而無法到訪問別的子類(同父類的親兄弟)所繼承的protected域。 說白了就是:老鼠只能叫"zhi,zhi"。即使他能看見貓(可以在自己的作用域內(nèi)創(chuàng)建一個cat對象),也永遠無法學(xué)會貓叫。
也就是說,cat所繼承的crowl方法在cat類作用范圍內(nèi)可見。但在rat類作用范圍內(nèi)不可見,即使rat,cat是親兄弟也不行。
另外:這就是為什么我們在用clone方法的時候不能簡單的直接將對象aObject.clone()出來的原因了。
總之,當(dāng)B extends A的時候,在子類B的作用范圍內(nèi),只能調(diào)用本子類B定義的對象的protected方法(該方法從父類A中繼承而來)。而不能調(diào)用其他A類對象的protected 方法
請看下面兩端代碼,其中包B中的貓和鼠都繼承了動物類。
復(fù)制代碼 代碼如下:
//代碼1:包A中有一個動物類
package testa;
public class Animal {
protected void crowl(String c){
System.out.println(c);
}
}
//代碼2:包B中有兩個類——貓類和鼠類
package testb;
import testa.Animal;
class Cat extends Animal{
}
class Rat extends Animal{
public void crowl(){
crowl("zhi zhi"); //沒有問題,繼承了Animal中的protected方法——crowl(String)
Cat cat=new Cat();
cat.crowl("miao miao"); //wrong, The method crowl(String) from the type Animal is not visible
}
}
既然,貓和鼠都繼承了動物類,那么在鼠類的作用范圍內(nèi),看不到貓所繼承的crowl()方法呢?
癥結(jié)所在:
protected受訪問保護規(guī)則是很微妙的。雖然protected域?qū)λ凶宇惗伎梢姟5怯幸稽c很重要,子類只能在自己的作用范圍內(nèi)訪問自己繼承的那個父類protected域,而無法到訪問別的子類(同父類的親兄弟)所繼承的protected域。 說白了就是:老鼠只能叫"zhi,zhi"。即使他能看見貓(可以在自己的作用域內(nèi)創(chuàng)建一個cat對象),也永遠無法學(xué)會貓叫。
也就是說,cat所繼承的crowl方法在cat類作用范圍內(nèi)可見。但在rat類作用范圍內(nèi)不可見,即使rat,cat是親兄弟也不行。
另外:這就是為什么我們在用clone方法的時候不能簡單的直接將對象aObject.clone()出來的原因了。
總之,當(dāng)B extends A的時候,在子類B的作用范圍內(nèi),只能調(diào)用本子類B定義的對象的protected方法(該方法從父類A中繼承而來)。而不能調(diào)用其他A類對象的protected 方法
您可能感興趣的文章:
- JAVA中static方法的用法實例詳解
- 實例分析Java中public static void main(String args[])是什么意思
- java必學(xué)必會之static關(guān)鍵字
- 深入淺析Java中Static Class及靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類的不同
- 從內(nèi)存地址解析Java的static關(guān)鍵字的作用
- 詳解Java編程中static關(guān)鍵字和final關(guān)鍵字的使用
- Java中static作用詳解
- Java里的static import使用小結(jié)
- Java中static關(guān)鍵字的作用和用法詳細介紹
- java之static關(guān)鍵字用法實例解析
- Java修飾符 abstract,static,final 的區(qū)別詳解
- Java中的static靜態(tài)代碼塊的使用詳解
- java 中的static關(guān)鍵字和final關(guān)鍵字的不同之處
- 詳解Java編程中protected修飾符與static修飾符的作用
相關(guān)文章
Spring cloud Feign 深度學(xué)習(xí)與應(yīng)用詳解
這篇文章主要介紹了Spring cloud Feign 深度學(xué)習(xí)與應(yīng)用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06在Spring?Boot使用Undertow服務(wù)的方法
Undertow是RedHAT紅帽公司開源的產(chǎn)品,采用JAVA開發(fā),是一款靈活,高性能的web服務(wù)器,提供了NIO的阻塞/非阻塞API,也是Wildfly的默認Web容器,這篇文章給大家介紹了在Spring?Boot使用Undertow服務(wù)的方法,感興趣的朋友跟隨小編一起看看吧2023-05-05AsyncHttpClient KeepAliveStrategy源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient KeepAliveStrategy源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Java實現(xiàn)利用廣度優(yōu)先遍歷(BFS)計算最短路徑的方法
這篇文章主要介紹了Java實現(xiàn)利用廣度優(yōu)先遍歷(BFS)計算最短路徑的方法,實例分析了廣度優(yōu)先遍歷算法的原理與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-04-04認識Java底層操作系統(tǒng)與并發(fā)基礎(chǔ)
這篇文章主要介紹了認識Java底層操作系統(tǒng)與并發(fā)基礎(chǔ),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07