Java-封装与访问控制
面向对象:封装与访问控制
封装及其必要性
- 封装就是隐藏内部实现的细节,只暴露接口
public class Home {
public static void main(Strinf[] args) {
Light light1 = new Light();
light.turnOn();
Light light2 = new Light();
light2.打开电路1();
light2.打开电路2();
light2.打开电路3();
}
}
public class Light {
public void turnOn() {
打开电路1()
打开电路2()
打开电路3()
}
public void 打开电路1() {
...
}
public void 打开电路2() {
...
}
public void 打开电路3() {
...
}
}
Home里面调用Light的方法,产生了耦合。耦合是不好的实践,因为耦合让扩展变得困难,比如开打电路3不需要了, 那么Home里面的代码也要跟着改变。如果把打开电路等都封装到turnOn方法里面,那么这种低耦合确保Home不需要改变。 封装的意义在于对外把暴露出尽可能少的接口
另外一个例子,
Public Class Person {
public Integer age;
public String name;
public setAge(Integer age) {
this.age = age
}
...
...
}
如果person.age
被调用了很多次,突然有一天领导说要大于100的按100算,那么凡是被调用的代码就需要修改无数个地方。
但是如果是通过person.setAge
调用的,只需要在Person
内部加一个简单的逻辑即可
更加真实的情况是你写的软件作为第三方库被别人用,如果你的一点点的改变需要让别人跟着改变,这样会让人头疼。 软件设计的核心之一是低耦合 不封装是一件非常恐怖的事情
访问控制符
-
4种访问限定符,通过限定符来行进封装,取得对外暴露尽可能少的接口
-
包的功能 ->
- 区分同名的类
- 访问控制(最重要): 提供了一种边界
- 包之间是没有包含/嵌套关系的
getter、setter方法与JavaBean约定
-
getter/setter的命名规则,最主要用途在JSON(前后端通信的事实标准),JSON 本质是用字符串来表示对象
-
序列化: 内存中的对象 -> 看得见的字符串/字节流 反序列化: 看得见的字符串/字节流 -> 内存中的对象 JSON是序列化/反序列化的一种实现
-
对JSON序列化/反序列化的时候,只看getter/setter,与实际的属性无关 如果属性存在,但是没有其getter/setter方法,那么序列化后的JSON不会包含该属性
设计模式实战
-
静态工厂方法的好处
- 是有自定义的名字
- 可以加入额外的逻辑,不一定每次调用都会创建新的对象
- 可以返回子类
- 可以根据输入参数不同返回不同的对象,可以预先定义好static的类, 然后不同情况返回不同的类,这样省时间,也省空间
-
静态工厂方法的坏处
- 不能被子类化,因为是静态的
- 不容易从文档中找到
-
Builder模式
类的访问控制符
-
怎么样做bridge(黑科技)
-
JVM只关心类名,类文件在哪里是无所谓的
-
java 9引入的module,模块化系统,提供更大层面的封装