十一、面向对象-进阶
1. 面向对象三大特征(一)-封装
1.1 概念
随着代码量的提升,类会越来越多,面向对象的开发原则我们需要遵循 高内聚,低耦合
高内聚:一个模块内部功能单一化,"自己的事情自己做"
低耦合:各个模块之间关系简单,"少依赖别人"
- 定义:所谓 封装,就是把客观事物封装成抽象概念的类,并且类把自己的数据和方法只向可信的类或者对象开放,向没必要开放的类或者对象隐藏;通俗来讲,也就是将数据和方法整合为类,然后把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装性的设计思想
- 作用:保护数据安全性,避免外部随意修改,同时降低代码耦合度。
- 实现:通过访问修饰符(public、protect、缺省、private)控制访问权限。
1.2 如何实现封装
实现封装就是控制类或成员的可见性范围。这就需要依赖权限修饰符(public、protect、缺省、private)
| 修饰符 | 本类内部 | 本包内 | 其他包的子类 | 其他包非子类 |
|---|---|---|---|---|
| private | √ | × | × | × |
| 缺省 | √ | √ | × | × |
| protected | √ | √ | √ | × |
| public | √ | √ | √ | √ |
1.3 封装的体现
在实际开发中,我们通常会 私有化类的成员变量,也就是 成员变量使用private修饰,再为其提供 公共的get和set方法,对外暴露获取和修改属性的功能,而这正是封装思想的体现
这样设计的好处在于:
- 只能通过预设的方法来访问数据,从而可以在方法中添加其他限制逻辑,例如年龄字段赋值限制不能小于0等
- 便于维护,访问方式不变的情况下,可以实现无感知维护。例如 java8->java9 将 String 从 char[] 改为了 byte[],而对外的方法不变,我们使用者根本感觉不到它内部的修改
代码示例:
public class Person {
// 私有化成员变量
private String name;
private int age;
// 通过公共方法实现 赋值和获取
public void setName(String n) {
name = n;
}
public String getName() {
return name;
}
public void setAge(int a) {
age = a;
}
public int getAge() {
return age;
}
}