1. 程式人生 > >06-訪問權限以及封裝

06-訪問權限以及封裝

position pac 問題 pre 所有權 -s div package javascrip

簡介:

訪問權限作用是我們將編寫的代碼發布出去,我們定義哪些是可用用的,哪些是不可以的,消費者程序員不會因為修改我們的代碼而導致程序異常,也不會破壞程序邏輯 訪問權限的控制被稱為具體實現的隱藏,把數據和方法包裝進類中,以及具體實現的隱藏,常共同被稱作是封裝。封裝性好的程序能夠是代碼更加嚴謹和安全。

1,空間隔離

java中相同名稱內容為了避免沖突使用隔離方案,例如A類和B類中都有f()方法,那麽A類和B類都是隔離方法的元素,程序通過判斷方法的所屬類來區分調用的是哪個方法,那麽多個同名的類是如何隔離的呢?答案是包,同包下同名的類不允許的,編譯器會直接報錯,不同的包相同A類則起到隔離作用,那麽調用區分1包和2包下的A類則是使用import導入時,導入全路徑下的A類,就能區分調用的A類是哪個了,通過import和package將單一的全局名稱空間分割開,使得編寫程序不會出現名稱沖突問題。
所以包也被稱為庫單元,A類.java被稱為編譯單元,或者叫做轉義單元。 2,訪問權限 java提供4中訪問權限,分別是public,private,protected,以及默認權限, 另外private是隱式的final修飾。所以如果再給private 方法添加final修飾,是可以但沒有實際意義。 結構如下:
權限類內同包不同包子類不同包非子類
private × × ×
default × ×
protected ×
public
本類調用所有權限的變量和方法,示例如下:
package com.javaApi.override
.publicTest; public class Hello { //訪問權限變量 依次private,default,public,protected private String strPrivate="strPrivate"; String strDefault="strDefault"; public String strPublic="strPublic"; protected String strProtected="strProtected"; public Hello(){ } private Hello(int
i){ System.out.println(i); } //訪問權限方法 依次private,default,public,protected private void privateMethod(){ System.out.println("privateMethod"); } void defaultMethod(){ System.out.println("defaultMethod"); } public void publicMethod(){ System.out.println("public method"); } protected void protectedMehtod(){ System.out.println("protectedMethod"); } @Test protected void runTest(){ //本類調用各個方法以及各個變量 Hello h=new Hello();//能夠訪問,能夠正常調用 h.publicMethod();//能夠訪問,能夠正常調用 h.privateMethod();//能夠訪問,能夠正常調用 h.defaultMethod(); //能夠訪問,能夠正常調用 h.protectedMehtod();//能夠訪問,能夠正常調用 h=new Hello(1);//能夠訪問,能夠正常調用 System.out.println(h.strPrivate);//能夠訪問,能夠正常調用 System.out.println(h.strPublic);//能夠訪問,能夠正常調用 System.out.println(h.strProtected);//能夠訪問,能夠正常調用 System.out.println(h.strDefault);//能夠訪問,能夠正常調用 } }

結果:

本類擁有所有權限,無論是private和還是public無論是變量還是方法,本類都是可以調用和訪問的 不同包下調用Hello類的各個方法,如下:
package com.javaApi.override;//與Hello不同包
public class Handler {
    //不同包的方法調用Hello類內容
    @Test
    public void  authority(){
        //不同包下只能訪問public,
        Hello h=new Hello();//能夠訪問,能夠正常調用
        
        //System.out.println(h.strPrivate);無法獲取,編譯器不通過
        System.out.println(h.strPublic);//能夠訪問,能夠正常調用
        //System.out.println(h.strProtected);//無法獲取,編譯器不通過
        //System.out.println(h.strDefault);//無法獲取,編譯器不通過
        
        h.publicMethod();//能夠訪問,能夠正常調用
    
        //h.privateMethod();無法調用方法而且編譯器也不通過。
        //h.defaultMethod(); 無法訪問,編譯器不通過
        //h.protectedMehtod();無法訪問,編譯器不通過
    
        /**
         * 由於參數為int類型的構造Hello(int i)方法是private方法,
         * 所以無法方法而且編譯器也不通過。
         */
        //h=new Hello(1);//無法訪問,編譯器不通過
    }
}

結果:

1,不同包下除了public方法和public變量其他方法和變量都無法調用,包括構造器方法,這裏調用時通過new出Hello類對象,通過該對象調用的。 同包下調用Hello類方法,如下
package com.javaApi.override.publicTest;//與Hello同包
public class Handler {
    @Test
    public void  authority(){
        Hello h=new Hello();//能夠訪問,能夠正常調用
        
        //System.out.println(h.strPrivate);無法獲取,編譯器不通過
        System.out.println(h.strPublic);//能夠訪問,能夠正常調用
        System.out.println(h.strProtected);//能夠訪問,能夠正常調用
        System.out.println(h.strDefault);//能夠訪問,能夠正常調用
    
        h.publicMethod();//能夠訪問,能夠正常調用
        //h.privateMethod();無法訪問,編譯器不通過
        h.defaultMethod();//能夠訪問,能夠正常調用
        h.protectedMehtod();//能夠訪問,能夠正常調用
    
        /**
         * 由於參數為int類型的構造Hello(int i)方法是private方法,
         * 所以無法方法而且編譯器也不通過。
         */
        //h=new Hello(1);無法訪問,編譯器不通過
    }
}

結果如下:

1,同包下調用,除了private方法和private變量,即private修飾的都不能被調用,其他都能被正常調用這裏調用時通過new出Hello類對象,通過該對象調用的。 不同包繼承權限情況如下:
package com.javaApi.override;;//與Hello不同包
//本HelloChild和父類Hello不同包
class HelloChild extends Hello{
    @Test
    @Override
    public void runTest(){
        HelloChild h=new HelloChild();
        h.publicMethod();//正常被繼承,能夠訪問,能夠正常調用
        //h.privateMethod();不能被繼承,不能夠訪問,能夠正常調用
        //h.defaultMethod(); 不能被繼承,不能夠訪問,能夠正常調用
        h.protectedMehtod();//正常被繼承,能夠訪問,能夠正常調用
        
        Hello h2=new HelloChild();
        //h2.protectedMehtod();不能夠訪問,不能夠正常調用
        
        //System.out.println(h.strPrivate);無法獲取,編譯器不通過
        System.out.println(h.strPublic);//能夠訪問,能夠正常調用
        System.out.println(h.strProtected);//能夠訪問,能夠正常調用
        //System.out.println(h.strDefault);無法獲取,編譯器不通過
    }
}

結果如下:

1,不同包下,public和protected能夠被繼承,默認和private不能被繼承。 2,註意在不同包下,引用為父類時如本示例h2,不能訪問protected方法,只能是子類引用可以方法,如本示例引用h,就能夠調用protected方法 同包繼承權限情況如下:
package com.javaApi.override.publicTest;//與Hello同包
//本HelloChild和父類Hello同包
class HelloChild extends Hello{
    @Test
    @Override
    public void runTest(){
        HelloChild h=new HelloChild();
        h.publicMethod();//正常被繼承,能夠訪問,能夠正常調用
        //h.privateMethod();不能被繼承,不能夠訪問,能夠正常調用
        h.defaultMethod(); //正常被繼承,能夠訪問,能夠正常調用
        h.protectedMehtod();//正常被繼承,能夠訪問,能夠正常調用
        
        Hello h2=new HelloChild();
        h2.protectedMehtod();//能夠訪問,能夠正常調用
        
         //System.out.println(h.strPrivate);無法獲取,編譯器不通過
        System.out.println(h.strPublic);//能夠訪問,能夠正常調用
        System.out.println(h.strProtected);//能夠訪問,能夠正常調用
        System.out.println(h.strDefault);//能夠訪問,能夠正常調用
    }
}

結果如下:

1,同包下,只有private不能被繼承,其他都能被繼承,即只要擁有能訪問的權限就用能被繼承的權限 2,註意在同包下,引用為父類和子類都能夠正常調用protected方法,如本示例h2,和h 總結: 代碼封裝和訪問權限在日常開發是最常見的,基本上就是java的全部,包括java設計模式以及OO設計原則都是對它們的各種運用。

06-訪問權限以及封裝