首先我們來(lái)看一下如下兩個(gè)示例:
示例一:
//包A中有一個(gè)動(dòng)物類 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"); //沒有問(wèn)題,繼承了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 } }
既然,貓和鼠都繼承了動(dòng)物類,那么在鼠類的作用范圍內(nèi),看不到貓所繼承的crowl()方法呢?
問(wèn)題解答:
protected受訪問(wèn)保護(hù)規(guī)則是很微妙的。雖然protected域?qū)λ凶宇惗伎梢姟5怯幸稽c(diǎn)很重要,不同包時(shí),子類只能在自己的作用范圍內(nèi)訪問(wèn)自己繼承的那個(gè)父類protected域,而無(wú)法到訪問(wèn)別的子類(同父類的親兄弟)所繼承的protected域和父類對(duì)象的protected域ani.crow1()。 說(shuō)白了就是:老鼠只能叫"zhi,zhi"。即使他能看見貓(可以在自己的作用域內(nèi)創(chuàng)建一個(gè)cat對(duì)象),也永遠(yuǎn)無(wú)法學(xué)會(huì)貓叫。
也就是說(shuō),cat所繼承的crowl方法在cat類作用范圍內(nèi)可見。但在rat類作用范圍內(nèi)不可見,即使rat,cat是親兄弟也不行。
另外: 這就是為什么我們?cè)谟胏lone方法的時(shí)候不能簡(jiǎn)單的直接將對(duì)象aObject.clone()出來(lái)的原因了。而需要在aObject.bObject=(Bobject)this.bObject.clone();
總結(jié):
當(dāng)B extends A的時(shí)候,在子類B的作用范圍內(nèi),只能調(diào)用本子類B定義的對(duì)象的protected方法(該方法從父類A中繼承而來(lái))。而不能調(diào)用其他A類(A 本身和從A繼承)對(duì)象的protected方法。
推薦教程:java入門程序