天天看點

Java Review (九、面向對象----封裝)了解封裝使用通路控制符

文章目錄

在面向對象程式設計方法中,封裝(英語:Encapsulation)是指一種将抽象性函式接口的實作細節部份包裝、隐藏起來的方法。

封裝( Encapsulation) 是面向對象的三大特征之一(另外兩個是繼承和多态) ,它指的是将對象的狀态資訊隐藏在對象内部,不允許外部程式直接通路對象内部資訊,而是通過該類所提供的方法來實作對内部資訊的操作和通路。

使用封裝,可以實作以下目的

  • 隐藏類的實作細節
  • 讓使用者隻能通過事先預定 的方法來通路資料,進而可以在該方法裡加入控制邏輯,限制對成員變量的不合理通路
  • 可進行資料檢查,進而有利于保證對象資訊的完整性。
  • 便于修改,提高代碼的可維護性

為了實作良好的封裝, 需要從兩個方面考慮

  • 将對象的成員變量和實作細節隐藏起來,不允許外部直接通路
  • 把方法暴露出來,讓方法來控制對這些成員變進行安全的通路和操作

是以,封裝實際上有兩個方面的含義:把該隐藏的隐藏起來;把該暴露的暴露出來 。

這兩個方面都需要通過使用 Java 提供的通路控制符來實作。

Java提供了3個通路控制符 private ,protected ,public ,分别代表了三個通路控制級别,另外還有個不加任何通路控制符的通路控制級别(預設),提供了四個通路控制級别 ,Java通路控制符的通路控制級别由小到大如圖:

通路控制級别圖

Java Review (九、面向對象----封裝)了解封裝使用通路控制符

Java 用于控制可見性的 4 個通路修飾符:

  • private:僅對本類可見
  • 預設(無修飾符): 對本包可見
  • protected: 對本包和所有子類可見
  • public 對所有類可見

Java通路控制符的通路範圍表如下:

通路控制範圍表

private default protected public
同一個類中
同一個包中
子類中
全局範圍

封裝執行個體

public class EncapTest{
   //使用 private 修飾成員變量,将這些成員變量隐藏起來 
   private String name;
   private String idNum;
   private int age;
 
   //提供方法來操作成員變量
   public int getAge(){
      return age;
   }
 
   public String getName(){
      return name;
   }
 
   public String getIdNum(){
      return idNum;
   }
 
   public void setAge( int newAge){
      age = newAge;
   }
 
   public void setName(String newName){
      name = newName;
   }
 
   public void setIdNum( String newId){
      idNum = newId;
   }
}      

關于通路控制符的使用,存在如下幾條基本原則:

  • 類裡的絕大部分成員變量都應該使用 private 修飾,隻有 一些static 修飾的,類似全局變量的成員變量,才可能考慮使用 public 修飾,除此之外,有些方法隻用于輔助實作該類的其他方法,這些方法被稱為工具方法 ,工具方法也應該使用 private 修飾
  • 如果某個類主要用做其他類的父類,該類裡包含的大分方法可能僅希望被其子類重寫,而不想被外界直接調用,則應該使用 protected 修飾這些方法。
  • 希望暴露出來給其他類自由調用的方法應該使用 public 修飾,是以,類的構造器通過使用 public修飾,進而允許在其他地方建該類的執行個體。外部類一般都用public修飾,以便被其它類通路。

參考:

【1】:《瘋狂Java講義》

【2】:《Java核心技術 卷一》

【3】:

https://www.runoob.com/java/java-encapsulation.html