是什么?
- Interface:
接口是一种行为的抽象。但是现在无论是接口还是抽象类,感觉都已经脱离了本来的这种定义。而主要用来解耦了。例如dao层就是一系列的接口,那么数据库实现就可以随时改动。 - 抽象类
抽象类是对象的抽象。使用较少。因为子类只能单一继承抽象类,大大限制了灵活性。
为什么?
- 上面说了,无论接口和抽象类,都已经被用来解耦了。除了dao层之外,例如Service层也要使用接口。事实上,这不是一定的。试想,我不可以直接改动实现类吗?的确,无意义的使用接口还不如不用。接口此时的作用,第一是对service层的说明。开发中可不是你自己一个人包揽一个项目,此时接口也成为了一个说明书,说明实现类的入参、出参、功能,再加上对功能的合理划分,就能使得每一个接口简单易懂,易维护。第二,就是解耦。接口的良好定义会强迫你去把不同的服务实现,即使只是一个简单的功能。例如登录过程中发送验证码,这是一个简单的功能,于是你就直接写在了登录服务里,那么之后要改动验证码的功能,是不是还要去登录里改?如果进行隐私操作时,需要验证码,你是不是还要重新写一次验证码验证?第三,就是对外暴露服务。比如在开发controller层时,还没有想好服务层的实现,不要紧,在接口中写一个就好了,之后再进行实现。此外,例如dubbo,微服务,已经不只是传统的三层架构了,更是把服务进行了更彻底的解耦,这时候更需要接口来对外规定服务的使用和名称。
怎么用?
- 接口
可以看到,接口常量是默认且不可更改的使用了staic final public
修饰的。且不可定义变量。方法不可以带上实现体。
此外,接口的另外一种适用使用方法:public void contextLoads() { Fly fly = new Fly() { @Override public void print1() { //实现 } @Override public void print2() { //实现 } }; }
- 抽次类
抽象类则和普通的类无差别,主要是对象关系上的抽象is a