目前为止,我们设计的类中的内容全都用的 public 访问修饰符,所谓 public 就是公共,外部使用者在任意位置都可以任意访问和操作。
在实际问题域中,对象的属性值其实鲜有公共的。仔细想想,别人可以肆意修改你的姓名、年龄、性别吗?你的成绩可以被任意改为负数吗?
数据的有效性和安全性是很重要的,所以在实际开发中我们通常只将可访问的常量设置为 public 。
所以修改器(setter)和访问器(getter)就派上用场了。搭配我们之前提到过的修饰符 private 私有,控制某些属性只能在这个类内部访问。
从名称上就能够看出这两个方法的用途:get 获取,加上 er 表示获取器;set 设置,加上 er 表示设置器。所以访问器方法 getter() 和修改器方法 setter() 就是为了让外部使用在类中被设计为 private 的属性的。

getter

既然是访问器,就必定会有访问结果,即返回值,所以该函数不可能是 void 的。
语法:

  1. // 声明
  2. public 被访问的属性的类型 get+被访问的属性名(){
  3. return 被访问的属性;
  4. }
  5. // 使用
  6. 实例.get访问的属性名();
  1. // 声明 GetterSetter.java
  2. public class GetterSetter {
  3. private int money = 500; // 内部属性
  4. // 无参构造
  5. public GetterSetter() {
  6. }
  7. // getter
  8. public int getMoney() {
  9. return this.money;
  10. }
  11. }
  12. // 调用 TestMain.java
  13. GetterSetter gs = new GetterSetter();
  14. System.out.println(gs.getMoney()); // 打印调用 getter 后的返回值

setter

语法:

  1. public void set+被访问的属性名(待改属性的类型 属性名){
  2. this.属性名 = 属性名;
  3. }
  1. // 声明
  2. public void setMoney(int money) {
  3. this.money = money;
  4. }
  5. // 调用
  6. GetterSetter gs = new GetterSetter(); // 实例 gs
  7. gs.money = XX; // 报错,因为 money 作为了 private
  8. gs.setMoney(100); // 修改
  9. System.out.println(gs.getMoney()); // 重新打印属性值

从这个例子可以看出,未来都会采用 private + setter/getter 的方式书写,让数据更加安全。我们也可以为某个 private 属性单独提供 get 或 set 让该属性只被访问或只修改。
这种开发方式还能控制传入的值合法性,进行值的有效性的管控,比如年龄、分数不可为负,将验证有效数据的控制在一处,而不是散布在每一次赋值的地方。
为了隐私性,不直接暴露类内部对数据的存放形式。
getter setter 同样存在快捷生成方式 【右键 - 生成 - getter 和 setter 】

Java 标准类(Java Bean 类)

在 95 年的技术白皮书中提出,只有满足规范的类才能称为 java Bean。 java 是一门工程学的语言,最大的特点就是建立庞大的项目,所以标准是很重要的,所有框架、工具几乎都要书写 java 标准类,不满要求的根本不能在这些框架、工具中运行起来。

规范:

  1. 必须提供公共无参构造
  2. 必须为私有属性提供符合命名规则的 get/set 方法
  3. 必须实现 serializable 接口(通用数据保存、读取和传输的接口,当前不做讨论)