基於Java protected的深入理解

來源:互聯網
上載者:User

一提到存取控制符protected,即使是初學者一般都會很自信的認為自己在這方面的理解沒有問題。那好,我們提一個問題出來看看.....

請看下面兩端代碼,其中包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
}
}

既然,貓和鼠都繼承了動物類,那麼在鼠類的作用範圍內,看不到貓所繼承的crowl()方法呢?

癥結所在:
protected受訪問保護規則是很微妙的。雖然protected域對所有子類都可見。但是有一點很重要,子類只能在自己的作用範圍內訪問自己繼承的那個父類protected域,而無法到訪問別的子類(同父類的親兄弟)所繼承的protected域。 說白了就是:老鼠只能叫"zhi,zhi"。即使他能看見貓(可以在自己的範圍內建立一個cat對象),也永遠無法學會貓叫。
也就是說,cat所繼承的crowl方法在cat類作用範圍內可見。但在rat類作用範圍內不可見,即使rat,cat是親兄弟也不行。
另外:這就是為什麼我們在用clone方法的時候不能簡單的直接將對象aObject.clone()出來的原因了。

總之,當B extends A的時候,在子類B的作用範圍內,只能調用本子類B定義的對象的protected方法(該方法從父類A中繼承而來)。而不能調用其他A類對象的protected 方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.