首页 > 代码库 > 面向对象中的封装性怎么理解?
面向对象中的封装性怎么理解?
封装这个解释,我一直喜欢用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(); }}
面向对象中的封装性怎么理解?