目前为止,我们设计的类中的内容全都用的 public
访问修饰符,所谓 public 就是公共,外部使用者在任意位置都可以任意访问和操作。
在实际问题域中,对象的属性值其实鲜有公共的。仔细想想,别人可以肆意修改你的姓名、年龄、性别吗?你的成绩可以被任意改为负数吗?
数据的有效性和安全性是很重要的,所以在实际开发中我们通常只将可访问的常量设置为 public 。
所以修改器(setter)和访问器(getter)就派上用场了。搭配我们之前提到过的修饰符 private 私有,控制某些属性只能在这个类内部访问。
从名称上就能够看出这两个方法的用途:get 获取,加上 er 表示获取器;set 设置,加上 er 表示设置器。所以访问器方法 getter() 和修改器方法 setter() 就是为了让外部使用在类中被设计为 private 的属性的。
getter
既然是访问器,就必定会有访问结果,即返回值,所以该函数不可能是 void 的。
语法:
// 声明
public 被访问的属性的类型 get+被访问的属性名(){
return 被访问的属性;
}
// 使用
实例.get访问的属性名();
// 声明 GetterSetter.java
public class GetterSetter {
private int money = 500; // 内部属性
// 无参构造
public GetterSetter() {
}
// getter
public int getMoney() {
return this.money;
}
}
// 调用 TestMain.java
GetterSetter gs = new GetterSetter();
System.out.println(gs.getMoney()); // 打印调用 getter 后的返回值
setter
语法:
public void set+被访问的属性名(待改属性的类型 属性名){
this.属性名 = 属性名;
}
// 声明
public void setMoney(int money) {
this.money = money;
}
// 调用
GetterSetter gs = new GetterSetter(); // 实例 gs
gs.money = XX; // 报错,因为 money 作为了 private
gs.setMoney(100); // 修改
System.out.println(gs.getMoney()); // 重新打印属性值
从这个例子可以看出,未来都会采用 private + setter/getter 的方式书写,让数据更加安全。我们也可以为某个 private 属性单独提供 get 或 set 让该属性只被访问或只修改。
这种开发方式还能控制传入的值合法性,进行值的有效性的管控,比如年龄、分数不可为负,将验证有效数据的控制在一处,而不是散布在每一次赋值的地方。
为了隐私性,不直接暴露类内部对数据的存放形式。
getter setter 同样存在快捷生成方式 【右键 - 生成 - getter 和 setter 】
Java 标准类(Java Bean 类)
在 95 年的技术白皮书中提出,只有满足规范的类才能称为 java Bean。 java 是一门工程学的语言,最大的特点就是建立庞大的项目,所以标准是很重要的,所有框架、工具几乎都要书写 java 标准类,不满要求的根本不能在这些框架、工具中运行起来。
规范:
- 必须提供公共无参构造
- 必须为私有属性提供符合命名规则的 get/set 方法
- 必须实现 serializable 接口(通用数据保存、读取和传输的接口,当前不做讨论)