封裝這個解釋,我一直喜歡用CPU作為例子
CPU把所有的電阻電容門電路等都封裝起來,只留出一些管腳(接口)讓用戶使用,CPU能暴露什么,不能暴露什么,是生產商設計決定的,用戶不能直接操作CPU的電阻電容等等,但可以通過給管腳適當的電壓來控制電阻電容等,也就是說用戶不能直接訪問CPU的屬性,但是可以通過方法修改CPU的屬性的值
同樣的一個類也是把屬性算法(邏輯處理)封裝起來,只留必要的方法(接口)讓用戶使用,一個類該暴露什么,不該暴露什么,由類的設計者根據需求設計決定的。private屬性用戶不能直接訪問,如果設計者提供相應的接口方法,那么用戶可以通過該接口方法訪問。
LZ的疑惑在於通過方法能修改屬性和直接修改屬性的區別,直接修改相當於不經過門電路直接給CPU的電阻電容等元件輸個電壓,這樣這個電壓(電流)是否超載不能有效保證,元件就有可能被燒壞,所以提供相應的方法訪問屬性,可以在方法中做相應的控制。同樣的,一個類,不直接修改屬性而通過方法來修改,可以在方法里做相應的處理避免用戶輸入的一些非法數據而造成系統故障。只不過對於POJO類來說,因為類本身只是作為數據的載體,並不帶有邏輯處理,所以一般的set方法就是簡單的給屬性賦值。
在面向對象程式設計方法中,封裝(英語:Encapsulation)是指,一種將抽象性函式接口的實作細節部份包裝、隱藏起來的方法。同時,它也是一種防止外界呼叫端,去存取物件內部實作細節的手段,這個手段是由編程語言本身來提供的。這兩個概念有一些不同,但通常被混合使用。封裝被視為是面向對象的四項原則之一。
適當的封裝,可以將物件使用接口的程式實作部份隱藏起來,不讓使用者看到,同時確保使用者無法任意更改物件內部的重要資料。它可以讓程式碼更容易理解與維護,也加強了程式碼的安全性。
程式范例[編輯]
C#范例[編輯]
這是一段C#代碼,演示了如何使用private
關鍵字限制變量的訪問:
namespace Encapsulation
{ class Program { public class Account { private decimal accountBalance = 500.00m; public decimal CheckBalance() { return accountBalance; } } static void Main() { Account myAccount = new Account(); decimal myBalance = myAccount.CheckBalance(); /* Main方法能夠通過public的“CheckBalance”方法確認賬戶余額,但是不能更改它 */ } } }
JAVA范例[編輯]
下面是Java的演示程序:
public class Employee { private BigDecimal salary = new BigDecimal(50000.00); public BigDecimal getSalary() { return salary; } public static void main() { Employee e = new Employee(); BigDecimal sal = e.getSalary(); } }