源自生活
燃气热水器里面有这种管道,为了充分受热,管道会绕来绕去,管道上有很多导热片,火焰喷嘴还需要高压点火装置,还有温度传感器、流量传感器、排气传感器、电池阀门、电路板…等等。
但是我们日常使用时非常简单,上了年纪的老人都能很好的掌握使用,左边水龙头一开,热水就来了。
我们仔细想一下,一个热水器,所有内部使用的东西都装在了铁皮壳子内,暴露给用户的东西是很少的,一个进水口、一个出水口、一个进气口、一个排气口、一个调节面板。
代码上的封装也是相同的道理,秉承“高内聚,低耦合”的主要思想。
封装的优点
-
提高代码的安全性。
-
提高代码的复用性。
-
“高内聚”:封装细节,便于修改内部代码,提高可维护性。
-
“低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。
访问控制符
-
private 表示私有,只有自己类能访问
-
default表示没有修饰符修饰,只有同一个包的类能访问
-
protected表示可以被同一个包的类以及其他包中的子类访问
-
public表示可以被该项目的所有包中的所有类访问
控制符 | 同一个类 | 同一个包 | 子类 | 所有类 |
---|---|---|---|---|
private | 可访问 | / | / | / |
default | 可访问 | 可访问 | / | / |
protected | 可访问 | 可访问 | 可访问 | / |
public | 可访问 | 可访问 | 可访问 | 可访问 |
类的属性
-
一般使用private访问权限。
-
提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作(注意:boolean变量的get方法是is开头!)。
-
一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。
示例
人这个类有姓名、年龄等属性;设置年龄时,我们需要做一些判断,以验证年龄的合理性;比如一个叫张三的人年龄为-90岁,什么鬼?一个叫李四的人年龄9000岁,这他妈是太监魏宗贤吧!显然直接将年龄属性暴露给外部修改是不合适的,别人还得单独加验证,每个人写的验证还可能不一样,最后搞得乱七八糟的;那么我们将年龄的验证封装到setAge方法中,别人设置年龄直接调用setAge方法传入年龄就ok了,不用再考虑年龄值是否合理。
/**
* 人
*/
class Human extends Object{
private String name; //姓名
private int age; //年龄
private boolean alive; //活的
//设置姓名
public boolean setName(String name) {
if(name.equals("")&&name.length()>12){
this.name = name;
return true;
}else{
return false;
}
}
//获取姓名
public String getName() {
return name;
}
//设置年龄
public boolean setAge(int age) {
if(age>=0&&age<=120){
this.age = age;
return true;
}else {
return false;
}
}
//获取年龄
public int getAge() {
return age;
}
public void setAlive(boolean alive) {
this.alive = alive;
}
public boolean isAlive() {
return alive;
}
}