文章目錄
在面向對象程式設計方法中,封裝(英語:Encapsulation)是指一種将抽象性函式接口的實作細節部份包裝、隐藏起來的方法。
封裝( Encapsulation) 是面向對象的三大特征之一(另外兩個是繼承和多态) ,它指的是将對象的狀态資訊隐藏在對象内部,不允許外部程式直接通路對象内部資訊,而是通過該類所提供的方法來實作對内部資訊的操作和通路。
使用封裝,可以實作以下目的
- 隐藏類的實作細節
- 讓使用者隻能通過事先預定 的方法來通路資料,進而可以在該方法裡加入控制邏輯,限制對成員變量的不合理通路
- 可進行資料檢查,進而有利于保證對象資訊的完整性。
- 便于修改,提高代碼的可維護性
為了實作良好的封裝, 需要從兩個方面考慮
- 将對象的成員變量和實作細節隐藏起來,不允許外部直接通路
- 把方法暴露出來,讓方法來控制對這些成員變進行安全的通路和操作
是以,封裝實際上有兩個方面的含義:把該隐藏的隐藏起來;把該暴露的暴露出來 。
這兩個方面都需要通過使用 Java 提供的通路控制符來實作。
Java提供了3個通路控制符 private ,protected ,public ,分别代表了三個通路控制級别,另外還有個不加任何通路控制符的通路控制級别(預設),提供了四個通路控制級别 ,Java通路控制符的通路控制級别由小到大如圖:
通路控制級别圖

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