把数据隐藏在类中, 只能通过方法获取, 这种技术叫作封装 (encapsulation). 因为它把数据(和内部方法) 安全地密封在类这个 "容器" 中, 只能由可信的用户 (即这个类中的方法) 访问.
为什么要封装呢?
(1)封装可以认为是一种保护, 防止该类的代码和数据被外部类的代码随机访问. 要访问本类的代码和数据, 必须通过严格的接口控制. 类中经常包含一些相互依赖的字段, 而且这些字段的状态必须始终如一. 如果允许程序员直接操作这些字段, 修改某个字段后可能不会修改重要的相关字段, 那么类的状态就前后不一致 了.
(2)隐藏类的内部实现细节. 程序员不需依赖依赖类这数据细节, 就可以放心地修改实现.
(3)让可见的字段尽量少, 可以保持类的整洁, 从而更易于使用和理解. 如果内部字段和方法在外部可见, 会弄乱类的 API.
(4)封装最主要的功能, 在于后续我们修改自己的实现的代码, API 不变即不影响那些调用我们接口的程序片段.
(5)适当的封装, 使代码容易被理解和维护, 也加强了代码安全性.
(6)如果方法对类的使用者可见, 就必须为其编写文档. 把方法隐藏起来, 可以节省时间和精力.
封装的优点:
1) 良好的封装能减少耦合.
2) 类内部的结构可以自由修改.
3) 可以对成员变量进行更精准的控制.
4) 隐藏实现细节.
封装实现的方法:
1) 修改字段的访问控制修饰, 限制类中字段的可见范围.
2) 对每个属性, 对外提供一对赋值, 取值接口, 用于对私有属性的访问.
样例:
- class test {
- private integer a;
- priavate double b;
- public void SetA(integer a) {
- this.a = a;
- }
- public integer getA() {
- return a;
- }
- public void SetB(double b) {
- this.b = b;
- }
- public double getB() {
- return b;
- }
- }
注: 如上的 this 是区分成员变量和局部变量.
后续访问 test 对象的属性, 只能通过 get 和 set 接口进行访问, 这些接口通常称之为 setter 和 getter 方法.
这些 setter 和 getter 方法称之为 "数据访问器". 在 Java 中, 数据访问器方法的命名有个通用约定, 即以 "get" 和 "set" 开 头. 但是, 如果要访问的字段是 boolean 类型, 那么读取字段的方法使用的名称可能会以 "is" 开头.
下面可以作为基于封装理念定义类的访问控制修饰符的经验:
• 只使用 public 声明组成类的公开 API 的方法和常量. 使用 public 声明的字段只能是常量和不能修改的对象, 而且必须同时使用 final 声明.
• 使用 protected 声明大多数使用这个类的程序员不会用到的字段和方法, 但在其他包中定义子类时可能会用到.
• 如果字段和方法供类的内部实现细节使用, 但是同一个包中协作的类也要使用, 那么就使用默认的包可见性.
• 使用 private 声明只在类内部使用, 在其他地方都要隐藏的字段和方法.
• 如果不确定该使用 protected, 包还是 private 可见性, 那么先使用 private. 设计 API 时这么做尤其重要, 因为提高访问限制是不向后兼容的改动, 可能会破坏依赖成员访问性的代码.
Java 语言(5)[类 & 对象] - 数据隐藏和封装
来源: http://www.bubuko.com/infodetail-3523724.html