首先我們來看看如下兩個範例:
範例一:
//包A中有一个动物类 package testa; public class Animal { protected void crowl(String c){ System.out.println(c); } }
(影片教學推薦:java影片)
範例二:
package testb; import testa.Animal; class Cat extends Animal { } public class Rat extends Animal{ public void crowl(){ this.crowl("zhi zhi"); //没有问题,继承了Animal中的protected方法——crowl(String) Animal ani=new Animal(); ani.crowl("animail jiaojiao"); //wrong, The method crowl(String) from the type Animal is not visible 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域和父類別物件的protected域ani.crow1()。 說白了就是:老鼠只能叫"zhi,zhi"。即使他能看見貓(可以在自己的作用域內創建一個cat物件),也永遠無法學會貓叫。
也就是說,cat所繼承的crowl方法在cat類別作用範圍內可見。但在rat類作用範圍內不可見,即使rat,cat是親兄弟也不行。
另外: 這就是為什麼我們在用clone方法的時候不能簡單的直接將物件aObject.clone()出來的原因了。而需要在aObject.bObject=(Bobject)this.bObject.clone();
總結:
當B extends A的時候,在子類別B的作用範圍內,只能呼叫本子類別B定義的物件的protected方法(該方法從父類別A繼承而來)。而不能呼叫其他A類(A 本身和從A繼承)物件的protected方法。
推薦教學:java入門程式
以上是實例詳解java中的protected關鍵字的詳細內容。更多資訊請關注PHP中文網其他相關文章!