Java類成員訪問許可權控制知識總結
一 前言
這篇文章是很基礎的一文,沒多大深度,對於開發人員必然是熟練於心。本篇文章的主題是為什麼java要設定類成員訪問級別?其原因也很簡單,就是為了面向物件的封裝特性;將類成員使用不同的訪問級別控制,在資料封裝後,其他的類成員想要訪問當前類成員,就必須要有足夠的許可權才能訪問;這樣做的目的就是我可以隨意修改不想讓其他類成員沒有許可權訪問的資料,只要約定好相關的協議,不影響其他類成員訪問即可;
二 許可權修飾詞介紹
- public 意指公有的意思,其修飾的成員許可權最低,表示任何成員都可以訪問;注意點是一個java原始檔中只能有一個類被宣告為public;
- defaut 預設級別,成員沒有修飾符號,在同一個包內能被其他成員訪問;
- protected 受保護的意思;表示子類能夠繼承父類的方法;在同一個包內被其修飾的成員,其子類能夠訪問;注意點是不可以修飾外部類;
- private 私有的意思;許可權最高,表示只允許類內部成員可以訪問;注意點是不可以修飾外部類;
修飾符 | 同一個類中 | 同一個包中的其他類 | 不同包的子類中 | 不同包的非子類中 |
---|---|---|---|---|
public | true | true | true | true |
protected | true | true | true | |
default | true | true | ||
private | true |
三 具體實施
3.1 public
在com.youku1327.base.authority2 包中建立了一個星球類,有個成員是shine表示光線,對應的getShine方法使用public修改,方法意思是獲得光線;
package com.youku1327.base.authority2; /** * @Author lsc * <p> 星球類 </p> */ public class Planet { private String shine = "好耀眼"; public String getShine(){ return shine; } }
在 com.youku1327.base.authority1 包中建立類ZSZXZ,使用import com.youku1327.base.authority2.Planet;匯入 Planet星球類;在main方法中建立星球類,呼叫獲得光線的方法,得到輸出結果是 好耀眼;驗證了public許可權最低,不同包之間得非子類就可以訪問;
package com.youku1327.base.authority1; import com.youku1327.base.authority2.Planet; /** * @Author lsc * <p> </p> */ public class ZSZXZ { public static void main(String[] args) { // 建立星球實體 Planet planet = new Planet(); // 訪問公有成員 String shine = planet.getShine(); // 好耀眼 System.out.println(shine); } }
將 星球類的getShine方法修飾符號改為 protected;
package com.youku1327.base.authority2; /** * @Author lsc * <p> 星球類 </p> */ public class Planet { private String shine = "好耀眼"; protected String getShine(){ return shine; } }
在com.youku1327.base.authority1中建立Earth類繼承星球類Planet(初學者只要理解extends關鍵字表示繼承的意思),繼承的方法是 getShine方法,然後在主類中建立地球例項,呼叫getShine方法,實際上是呼叫 Planet的 getShine 方法(super.getShine(),super意指高階,表示父類 );驗證了不同包的子類可以呼叫父類被protected修飾的成員;
package com.youku1327.base.authority1; import com.youku1327.base.authority2.Planet; /** * @Author lsc * <p> 地球類</p> */ public class Earth extends Planet { @Override protected String getShine() { // 呼叫了父類的getShine方法 return super.getShine(); } // 執行前註釋掉ZSZXZ中的main方法 public static void main(String[] args) { // 建立地球 Earth earth = new Earth(); // 好耀眼 System.out.println(earth.getShine()); } }
在回去看看原來的ZSZXZ類的getShine發現報錯了;驗證了不同包的非子類,使用protected修飾無法訪問;
3.3 default
將 Planet 星球類 的 getShine 方法的修飾符去掉,程式碼如下
package com.youku1327.base.authority2; /** * @Author lsc * <p> 星球類 </p> */ public class Planet { private String shine = "好耀眼"; String getShine(){ return shine; } }
隨著發現 之前的地球類報錯了,我們把整個地球類註釋掉;驗證了default修飾的成員不能誇包訪問;
我們在 Planet 的同級包下建立Moon類,呼叫 Planet的getShine方法,成功執行;驗證了default修飾的成員能在同一個包中被訪問;
package com.youku1327.base.authority2; /** * @Author lsc * <p> </p> */ public class Moon { public static void main(String[] args) { // 建立星球實體 Planet planet = new Planet(); // 訪問公有成員 String shine = planet.getShine(); // 好耀眼 System.out.println(shine); } }
3.4 private
將 Planet 星球類 的 getShine 方法的修飾符改為private;
package com.youku1327.base.authority2; /** * @Author lsc * <p> 星球類 </p> */ public class Planet { private String shine = "好耀眼"; private String getShine(){ return shine; } }
發現 之前的 的Moon類主方法中的getShine方法報錯了,驗證了private在同包不同類中不可以被訪問;getShine() 中可以使用 shine 欄位,驗證了同一個類中可以使用private修飾的成員;
private String shine = "好耀眼"; private String getShine(){ return shine; } }
發現 之前的 的Moon類主方法中的getShine方法報錯了,驗證了private在同包不同類中不可以被訪問;getShine() 中可以使用 shine 欄位,驗證了同一個類中可以使用private修飾的成員;
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。