06-訪問權限以及封裝
阿新 • • 發佈:2018-11-18
position pac 問題 pre 所有權 -s div package javascrip
所以包也被稱為庫單元,A類.java被稱為編譯單元,或者叫做轉義單元。
2,訪問權限
java提供4中訪問權限,分別是public,private,protected,以及默認權限,
另外private是隱式的final修飾。所以如果再給private 方法添加final修飾,是可以但沒有實際意義。
結構如下:
本類調用所有權限的變量和方法,示例如下:
簡介:
訪問權限作用是我們將編寫的代碼發布出去,我們定義哪些是可用用的,哪些是不可以的,消費者程序員不會因為修改我們的代碼而導致程序異常,也不會破壞程序邏輯 訪問權限的控制被稱為具體實現的隱藏,把數據和方法包裝進類中,以及具體實現的隱藏,常共同被稱作是封裝。封裝性好的程序能夠是代碼更加嚴謹和安全。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(inti){ 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-訪問權限以及封裝