06-訪問許可權以及封裝
阿新 • • 發佈:2018-11-19
簡介:
訪問許可權作用是我們將編寫的程式碼釋出出去,我們定義哪些是可用用的,哪些是不可以的,消費者程式設計師不會因為修改我們的程式碼而導致程式異常,也不會破壞程式邏輯 訪問許可權的控制被稱為具體實現的隱藏,把資料和方法包裝進類中,以及具體實現的隱藏,常共同被稱作是封裝。封裝性好的程式能夠是程式碼更加嚴謹和安全。1,空間隔離
java中相同名稱內容為了避免衝突使用隔離方案,例如A類和B類中都有f()方法,那麼A類和B類都是隔離方法的元素,程式通過判斷方法的所屬類來區分呼叫的是哪個方法,那麼多個同名的類是如何隔離的呢?答案是包,同包下同名的類不允許的,編譯器會直接報錯,不同的包相同A類則起到隔離作用,那麼呼叫區分1包和2包下的A類則是使用import匯入時,匯入全路徑下的A類,就能區分呼叫的A類是哪個了, 通過import和package將單一的全域性名稱空間分割開,使得編寫程式不會出現名稱衝突問題。許可權 | 類內 | 同包 | 不同包子類 | 不同包非子類 |
---|---|---|---|---|
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設計原則都是對它們的各種運用。