相信大家刚接触Interface与Abstruct Class的时候会有些懵,觉得这两个对象差不多,我也一样,这篇文章将讲解这二者之间的区别与联系。我是站在复习完的角度看,所以有些小伙伴对有些东西不理解也是正常。
一、相同点
1.作用相同
这二者都可以将具体的问题抽象,提取共性的东西,从而提高代码的重用性。
二者都可以规范代码,比方说输出,如果有多个人写同一个项目,一个人写print,一个人写show,维护起来十分麻烦,这个时候就可以在抽象类或是接口中写一个print()方法,其他人都重写这个方法。
都可以指向子类/实现类的引用,通过动态绑定的方式实现运行时类型和编译时类型的绑定实现多态(一种编译类型但是有多种可能的运行时类型)。从而达到非常灵活的效果,设计模式中的动态代理用到了这个点,
也是遵循了设计模式中的OCP(开闭原则),使代码更容易扩展。
2.都不能被实例化(new)
因为有没有实现的方法,故不能实例化
3.都需要在实现/继承的类中重写其抽象方法
二、Interface与Abstruct Class区别
1.层次差异
我觉得Interface的抽象程度是高于Abstruct的,如果说Abstruct Class是 is a的关系,Interface可以说是like a 的关系,像的抽象程度是明显高于是的。
2.语法差异
1)声明方式
一个是abstruct class 用extend, 另一个是interface用implements
2)变量类型
Interface中变量类型默认为public static final ,必须赋初值,不能被修改。其所有的成员方法都是public abstract的。
抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
3)构造器
因为 interface中的变量默认是final的,无需传参,故没有构造器。
抽象类具有构造器。
4)继承个数
抽象类是类,Java是严格遵守单继承的。
为了完善单继承的不方便,接口是多实现的。
三、二者之间的关系
现在有一个场景,动物园里有动物,动物有相同行为,所以抽象一个action接口
定义猴子和小鸟类实现这个接口
可以看到代码大同小异,这个时候该抽象类出场了,定义Animal抽象类。
可以看到代码量明显减少了,我认为抽象类就是对于对接口的预实现,从而减少实现接口重复实现共性代码。
四、杂谈
1.接口default修饰符
在JDK1.8中对接口增加了新的特性:默认方法(default method)
其实这个default方法的作用是让多个没有实现的方法可以才接口中被组装成更为复杂的方法从而更加方遍,而不是偷懒把方法体全部设成空,实现类中就不会有不好看的红线,这种方式破坏了接口的抽象程度,使之更接近抽象类
2.适配器模式
适配器模式是一种设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。适配器模式主要用于解决两个已有接口之间不兼容的问题。适配器模式通过创建一个适配器类,该适配器类包装了一个已有的类,并实现了客户端所期望的目标接口。这样客户端就可以通过适配器类与原本不兼容的类进行交互,而不需要直接使用原本不兼容的类。适配器模式可以使得不同的类能够协同工作,提高代码的复用性和灵活性。
// 目标接口
interface Target {
void request();
}
// 适配者类
class Adaptee {
public void specificRequest() {
System.out.println("Adaptee: specificRequest() method");
}
}
// 适配器类
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
// 客户端代码
public class AdapterPatternExample {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target adapter = new Adapter(adaptee);
adapter.request();
}
}
以上是本人的一点小小新的,如有错误,请大家斧正。