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

06-訪問許可權以及封裝

簡介:

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

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設計原則都是對它們的各種運用。