前言:如果提到protected的訪問控制級別,您的第一反應是”只能是子類才可以訪問“,那麼您很可能需要往下看。
首先,大致介紹一下各個訪問控制符的訪問控制級別(具體的介紹很多大牛的博文都有介紹,我就不細說了,可以點選 這裡 檢視),如下圖:
private | default | protected | public | |
同一個類中 | ||||
同一個包中 | ||||
子類中 | ||||
全域性範圍內 |
在這裡,很多人都存在一個誤區,就是,認為protected修飾的方法只能在子類中才能訪問,其他情況下不行;事實上,正確的表述方式應該是”如果在同一個包,則protected修飾的成員都可以被訪問到;假如不在同個包,則只有子類才能訪問到“。
下面寫一個例項(也可以到 這裡 下載):
(1)首先是程式的結構,這裡,有兩個包,分別有com.harvin包含parent和child類;com.other包含other_child類
(2)com.harvin.Parent類的程式碼:
package com.harvin; /* * @author harvin */ public class Parent { public static void main(String[] args){ } private void private_method() { } protected void protected_method() { } void default_method(){ } public void public_method(){ } }
(3)com.harvin.child類程式碼:
package com.harvin; public class Child{ private void private_method() { //這裡會報錯。因為private修飾的成員,其他類均不可訪問 new Parent().private_method(); } protected void protected_method() { //同一個包內,不過是不是子類,都可以訪問到protected成員 new Parent().protected_method(); } void default_method(){ //同一個包內,也可以訪問 new Parent().default_method(); } public void public_method(){ new Parent().public_method(); } }
(4)com.other.other_child類的程式碼:
package com.other; import com.harvin.*; public class Other_child extends Parent{ private void private_method() { //這裡會報錯。因為private修飾的成員,其他類均不可訪問 super.private_method(); } protected void protected_method() { //這裡會報錯。不在同一個包內,但是是parent的子類,所以可以訪問 super.protected_method(); } void default_method(){ //這裡會報錯。不在同一個包內,不可以訪問 super.default_method(); } public void public_method(){ super.public_method(); } }