Java面向对象二之封装
学习笔记,仅供参考
背景
在上次小伙用 Java 重新实现了记录狗日常生活的程序后,就开始让小区的人使用起来。
但某一天张大爷发现了程序的漏洞,表示程序不安全,想要退出使用。经小伙询问才知道,原来这个程序所用的数据都是对用户公开的,使得用户可以对这些数据为所欲为。
小伙经一番查询后发现之所以如此,是因为程序中使用了 public
修饰词,经它修饰的变量是让所有的对象都能使用此变量,而这就会不安全。比如,某银行程序让用户写入存款数目时,若是用 public
修饰存款的变量,那么人人都是富翁了。
所以,程序中的变量不能让用户去随便的修改,为所欲为。这就要用到 private
修饰词,让所有的对象都不能直接使用此变量,而是通过间接地方法调用来完成数据的读写。
于是,小伙立即将 public
修饰的成员变量全改为了 private
。
封装(encapsulation)
经查阅,这种不让对象直接使用变量而通过方法调用来间接地使用的操作叫做封装。封装就像是一种屏障,将类中的数据和代码保护起来,不让外部定义的代码随机的访问,以此来达到数据的安全。经封装后的程序如下:
public class Dogs {
// 将变量用 private 修饰
private String name;
private int age;
private String variety;
// 设置、写入对象的成员变量
public void setName(String name) {
// 将形参 name 交给对象的 name
// 这里的 this 就代指 object, 如wangDog, zhangDog..
this.name = name;
}
// 获得、读取对象的成员变量
public String getName() {
// 将对象的 name 返回
return this.name;
}
// ... 其他变量的 setter, getter 以及类的行为
}
/********分割*********/
public class Main {
public static void main(String[] args) {
// 同之前一样,注册用户
Dogs wangDog = new wangDog();
// 填写信息
wangDog.setName("Tom");
wangDog.setAge(2);
wangDog.setVariety("藏獒");
// 使用变量,如打印狗的名字
System.out.println("王阿姨家狗的名字:"+wangDog.getName());
// 其他程序 ...
}
}
封装后的成员变量要由 getter 和 setter 这两个类的方法来间接读写到变量。若是想对写入的变量有所限制,只需在 setter 中将从方法形参获得的值加以判断处理即可。比如,对获得的年龄加以限制,要求年龄在 0 ~ 30 岁之间,其他则返回提示信息并将年龄默认为 0。
public void setAge(int age) {
// 判断输入的数值是否合理
if (age > 0 || age < 30) {
System.out.println("您输入的年龄数值不合法,系统已将其默认为 0,请输入 0 - 30 之间的数字");
this.age = 0;
}else{
this.age = age;
}
}
封装效果图如下:
IDEA 中封装的操作
一个私有的变量要两个方法,两个就要有四个,以此类推,当变量多后手敲这些难免有些枯燥。于是,像 IDEA 这种编辑器就提供了自动生成的功能,Alt+Insert 或右键调出 Generate,在 Generate 中有一些能自动生成的选项,选择 setter 和 getter,在其中选择想要自动生成的变量即可。下面为界面图:
另一种更加简便的方法是导入外部包,引用 setter, getter 注解,相当于直接用别人写好的,直接拿来用。代码在 jar 包中,不在所写程序中,使程序更加简洁。
操作步骤
:
1. 在 IDEA 中下载 Lombok 插件,setting -> plugins, 搜索安装即可
从 maven 库 中搜索 Lombok,下载 jar 包
在 IDEA 的项目文件夹下创建一个新文件夹,接着将下好的 jar 包拖进去
在 IDEA 的 Setting -> Build, Execution, Deployment -> Compiler -> Annotation processors -> 勾选 Enable.. 复选框 -> Rebuild
若是想要对写入的变量加以限制,只需在类中手写出想要限制变量的 setter(); 方法即可。这就完成了方法的重写,当再使用该方法时,以重写的为准。