1.封装
1.1封装隐藏内部实现细节,只暴露出接口
调用turn On方法叫做低耦合,而调用三个方法叫做高耦合。
如果某天将开灯的实现删减到2个,那么Home类中,light2的三个方法就不能开灯了,会导致所有使用三个方法开灯的类都报错。
而低耦合,只通过调用某一个方法,不管方法的内部如何实现,不管方法的内部怎么改,只要Light类的turn On方法没有出错,那么所有调用这个方法的类都不会报错。
1.2封装的正确使用
2.属性和方法的访问控制符
包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
不加任何的访问限定符就是包级私有(package private)
不加任何的访问限定符就是包级私有的
包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
3.JavaBean约定:getter,setter
getter是得到属性的方法,setter是设置一个属性的方法
3.1非boolean属性的get,set命名方法
get X setX(X就是首字母大写的属性)
public class Persion{
private String firstName;
public String getFirstName(){
return firstName;
}
public void setFirstName(String firstName){
this.firstName = firstName;
}
}
3.2boolean属性的get,set命名方法
isXxx, setXxx(X是首字母大写的属性)
public class Person{
private boolean male;
public boolean isMale(){
return male;
};
public void setMale(Boolean male){
this.male = male
}
}
3.3应用:json序列化和反序列化
对JSON进行操作的时候,只看getter和setter方法,不看实际的属性
序列化:将对象转换为字符串
反序列化:将字符串转换为对象
将fastjson放入pom,然后点击maven的刷新
序列化读取属性使用get方法:JSON.toJSONString()
去掉name属性,只留下get方法,在转换后得到的json字符串中有name属性,说明在转换的时候没有读取cat的name属性, 而是用get Name方法来获得name属性。
反序列化:JSON.parseObject()
4.设计模式
4.1工厂方法
静态工厂方法和构造器的区别
静态方法可以直接 类.静态方法() 进行使用,不需要手动新建实例。
静态工厂方法和构造器的区别:
静态工厂方法有名字,可以清楚表达自己在做什么
优点1:静态工厂方法不一定会创建一个实例,例如这里当名字不合法时,会直接返回一个空指针
优点2:可以返回类型的子类型
优点3:当传入的参数不合法时,返回一个已经创建的“无效的”猫,不用每次都创建一次无效的猫,省时间省内存
4.2builder模式
当一个类的属性过多,并且都是相同的类型,那么在创建这个类的实例时,会有传错参数的情况。
builder实际上就是将参数改造成方法,调用的时候就不用一下子传入很多参数了,因为builder的方法返回的是this,所以可以使用链式调用
现在有一个person类,有许多参数,在创建实例时需要传入多个参数。
使用builder模式
会新创建一个Person Builder类。
在使用时,用PersonBuilder里面的方法来生成Person类。
5.类的访问控制符
5.1用bridge来连接包级私有和外部(生产中不要使用)
一般的类声明的时候都是public class xxxx{},但是这个类没有public,说明这个类是包级私有的。在包外无法访问。
现在,我想要在包外使用这个类。
首先新建一个bridge类,这个类所在的包名和私有类的包名相同。
只要包名相同,不在同一个目录内就行。
类中有个静态方法,返回值类型为Object,不是私有类是因为在调用的地方无法访问这个类,返回私有类的实例。
这样,就能在别的地方通过bridge的静态方法new Instance来创建私有的类。
6.模块系统(jdk9特性)
模块系统是将很多的包打包后暴露一个接口方便别人的使用。这个jdk9的一个特性。
在jdk8中,如果需要在包外访问包内的类,就要将包内的类声明为public,这样,别的所有地方都能使用包内的这个类,这样就不好了,在jdk8中的解决方法是将某个你不想被别人访问,却不得不将类名声明为public的类放到internal包中来提醒别人不要调用这个包里面的类。