Java學習筆記(4)----Public,Protected,Package,Private修飾符可見性


Java修飾符類型(public,protected,private,friendly)

public的類、類屬變量及方法,包內及包外的任何類均可以訪問;
protected的類、類屬變量及方法,包內的任何類,及包外的那些繼承了此類的子類才能訪問;
private的類、類屬變量及方法,包內包外的任何類均不能訪問;
如果一個類、類屬變量及方法不以這三種修飾符來修飾,它就是friendly類型的,那么包內的任何類都可以訪問它,而包外的任何類都不能訪問它(包括包外繼承了此類的子類),因此,這種類、類屬變量及方法對包內的其他類是友好的,開放的,而對包外的其他類是關閉的。

從開放性來說,public > protected > package > private 。  其中 package修飾符就是默認修飾符,也就是缺省修飾符情況下的修飾符,實際中package 修飾符不能寫出。

 

示例:

在同一工程中,在 src 包中定義 Modifier類 (且在Modifier類文件中定義默認修飾符類DefaultClass類),Modifier類的子類ModifierSub類,SamePackageTestModifier類;在另一個包 mvc.circle 包中,定義DifferentPackageTestModifierSub類,DifferentPackageTestModifier類,其中的函數和類的可見性如下所示:

-- src/Modifier.java文件

package src;

public class Modifier {
    public void methodPublic(){
        System.out.println("這是Public方法");
    }
    protected void methodProtected(){
        System.out.println("這是Protected方法");
    }
    void methodDefault(){
        System.out.println("這是Default方法");
    }
    private void methodPrivate(){
        System.out.println("這是Private方法");
    }
    
    public void doTest(){
        DefaultClass aClass=new DefaultClass();
        aClass.methodPublic();  //同一包中,DefaultClass類的Public方法可見
        aClass.methodProtected();//同一包中,DefaultClass類的Protected方法可見
        aClass.methodDefault();  //同一包中,DefaultClass類的Default方法可見
                                //同一包中,DefaultClass類的Private方法不可見
    }
}

class DefaultClass{
    public void methodPublic(){
        System.out.println("這是Default類的Public方法");
    }
    protected void methodProtected(){
        System.out.println("這是Default類的Protected方法");
    }
    void methodDefault(){
        System.out.println("這是Default類的Default方法");
    }
    private void methodPrivate(){
        System.out.println("這是Default類的private方法");
    }
}

 

-- src/ModifierSub.java 文件

package src;


public class ModifierSub extends Modifier {
    public void doTest(){
        methodPublic();    //子類中,父類Public方法可見
        methodProtected();//子類中,父類Protected方法可見
        methodDefault();//子類中,父類Default方法可見
                        //子類中,父類Private方法不可見
        
        //測試默認修飾符的類
        DefaultClass aClass=new DefaultClass();//同一包中,默認修飾符的類可見
        aClass.methodPublic();    //同一包中,默認修飾符的類的Public方法可見
        aClass.methodProtected();//同一包中,默認修飾符的類的Protected方法可見
        aClass.methodDefault();    //同一包中,默認修飾符的類的Default方法可見
                                //同一包中,默認修飾符的類的Private方法不可見
    }
}

 

-- src/SamePackageTestModifier.java文件

package src;

public class SamePackageTestModifier {
    Modifier Modifier=new Modifier();
    public void doTest(){
        Modifier.methodPublic();    //同一包中,Public 方法可見
        Modifier.methodProtected();//同一包中,Protected方法可見
        Modifier.methodDefault();    //同一包中,Default方法可見
                                    //同一包中,Private方法不可見
        //同一包中,DefaultClass類可見
        DefaultClass aClass=new DefaultClass();
        aClass.methodPublic();    //同一包中,DefaultClass類的Public方法可見
        aClass.methodProtected();//同一包中,DefaultClass類的Protected方法可見
        aClass.methodDefault();  //同一包中,DefaultClas類的Default方法可見
                                //同一包中,DefaultClass類的Private方法不可見
    }
}

 

-- mvc/circle/DifferentPackageTestModifierSub.java文件

package mvc.circle;

import src.Modifier;

public class DifferentPackageTestModiferSub extends Modifier {
    public void doTest(){
        methodPublic();    //不同包的子類中,Public方法可見
        methodProtected(); //不同包的子類中,Protected方法可見
                            //不同包的子類中,Default方法不可見
        //不同包子類中,DefaultClass不可見    
    }
}

 

-- mvc/circle/DifferentPackageTestModifier.java 文件

package mvc.circle;

import src.Modifier;

public class DifferentPackageTestModifer {
    Modifier modifier;
    public void doTest(){
        modifier=new Modifier();
        modifier.methodPublic();    //不同的包中,只有Public方法可見
        
        //不同包中,DefaultClass不可見
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM