1.封装

1.1封装隐藏内部实现细节,只暴露出接口

image.png

调用turn On方法叫做低耦合,而调用三个方法叫做高耦合。
如果某天将开灯的实现删减到2个,那么Home类中,light2的三个方法就不能开灯了,会导致所有使用三个方法开灯的类都报错。

而低耦合,只通过调用某一个方法,不管方法的内部如何实现,不管方法的内部怎么改,只要Light类的turn On方法没有出错,那么所有调用这个方法的类都不会报错。
image.png

1.2封装的正确使用

image.png

2.属性和方法的访问控制符

包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
不加任何的访问限定符就是包级私有(package private)
image.png

不加任何的访问限定符就是包级私有的
包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
image.png

3.JavaBean约定:getter,setter

getter是得到属性的方法,setter是设置一个属性的方法
image.png

3.1非boolean属性的get,set命名方法

get X setX(X就是首字母大写的属性)

  1. public class Persion{
  2. private String firstName;
  3. public String getFirstName(){
  4. return firstName;
  5. }
  6. public void setFirstName(String firstName){
  7. this.firstName = firstName;
  8. }
  9. }

3.2boolean属性的get,set命名方法

isXxx, setXxx(X是首字母大写的属性)

  1. public class Person{
  2. private boolean male;
  3. public boolean isMale(){
  4. return male;
  5. };
  6. public void setMale(Boolean male){
  7. this.male = male
  8. }
  9. }

3.3应用:json序列化和反序列化

对JSON进行操作的时候,只看getter和setter方法,不看实际的属性

序列化:将对象转换为字符串
反序列化:将字符串转换为对象

将fastjson放入pom,然后点击maven的刷新
image.png

进行序列化和反序列化

序列化读取属性使用get方法:JSON.toJSONString()

image.png

去掉name属性,只留下get方法,在转换后得到的json字符串中有name属性,说明在转换的时候没有读取cat的name属性, 而是用get Name方法来获得name属性。
image.png

反序列化:JSON.parseObject()

image.png

4.设计模式

4.1工厂方法

image.png
要将构造器私有化,不让别人调用 Cat构造器。

静态工厂方法和构造器的区别

静态方法可以直接 类.静态方法() 进行使用,不需要手动新建实例。

静态工厂方法和构造器的区别:
静态工厂方法有名字,可以清楚表达自己在做什么
image.png

优点1:静态工厂方法不一定会创建一个实例,例如这里当名字不合法时,会直接返回一个空指针

image.png

优点2:可以返回类型的子类型

image.png

优点3:当传入的参数不合法时,返回一个已经创建的“无效的”猫,不用每次都创建一次无效的猫,省时间省内存

image.png
image.png

4.2builder模式

当一个类的属性过多,并且都是相同的类型,那么在创建这个类的实例时,会有传错参数的情况。
builder实际上就是将参数改造成方法,调用的时候就不用一下子传入很多参数了,因为builder的方法返回的是this,所以可以使用链式调用

现在有一个person类,有许多参数,在创建实例时需要传入多个参数。
image.png
image.png

使用builder模式
image.png
会新创建一个Person Builder类。
image.png
在使用时,用PersonBuilder里面的方法来生成Person类。
image.png

5.类的访问控制符

image.png

5.1用bridge来连接包级私有和外部(生产中不要使用)

一般的类声明的时候都是public class xxxx{},但是这个类没有public,说明这个类是包级私有的。在包外无法访问。
image.png

现在,我想要在包外使用这个类。
首先新建一个bridge类,这个类所在的包名和私有类的包名相同。
只要包名相同,不在同一个目录内就行。
类中有个静态方法,返回值类型为Object,不是私有类是因为在调用的地方无法访问这个类,返回私有类的实例。
image.png

这样,就能在别的地方通过bridge的静态方法new Instance来创建私有的类。
image.png

并且,java.lang这个包名在自己项目中是无法创建的。
image.png

6.模块系统(jdk9特性)

模块系统是将很多的包打包后暴露一个接口方便别人的使用。这个jdk9的一个特性。

在jdk8中,如果需要在包外访问包内的类,就要将包内的类声明为public,这样,别的所有地方都能使用包内的这个类,这样就不好了,在jdk8中的解决方法是将某个你不想被别人访问,却不得不将类名声明为public的类放到internal包中来提醒别人不要调用这个包里面的类。