再學Java 之 private、protected、public和default的作用域

scutwang發表於2014-05-01

前言:如果提到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();
    }
}

 

相關文章