首先抽象类对应的是子类,接口对应的实现。
也就是抽象类的子类继承了父类的全部特性,是一个更具体的父类。就像兔子类继承动物类。
而接口的实现则是具备有自己的特性,他和接口是两个不同的类,只是它实现了接口中所有的方法。
所以在概念上抽象类和接口的作用是完全不同的。所以抽象类与子类的关系是"is-a",而接口与实现的关系是"like a"
附:
意义 | 使用场景 | 举例 | |
---|---|---|---|
is-a | A是B | 继承 | 兔子继承动物类 |
has-a | A有B | 在A类中创建类B对象 | 在员工类中创建电脑类的对象 |
like-a | A组合B | A是接口B的实现 | 空调实现了制冷接口中的方法 |
在语法使用中的区别:
1.抽象类用extends,接口用implements
2.抽象类有构造方法,接口没有
3.在Java中只能存在单继承,所有抽象类只能是单继承,但是接口可以做到多实现。即连续多个implements
4.抽象类 中可以有普通方法,接口中只能是抽象方法(JDK1.7之前,1.8以后接口也可以有普通方法)
5.抽象类中可以有普通变量,接口中只能存在被public static final 修饰的静态最终常量
6.接口类中的方法修饰符可以是public、private和protected,而接口中的方法一定是public的。
7.如果一个类中有抽象方法,那么一定要被声明为抽象类 。而声明为抽象类的方法可以没有抽象方法。如果一个接口中有方法,那一定得是抽象方法。
8.补充说明:抽象方法没有方法体。大括号也不能有。
9.抽象类不能被实例化。
10.继承抽象类的子类必须实现父类所有方法。否则也要声明为抽象。接口的实现类也必须实现接口中的所有方法。
11.JDK 1.8以前,抽象类的方法默认访问权限为protected,JDK 1.8时,抽象类的方法默认访问权限变为default。JDK 1.8以前,接口中的方法必须是public的,JDK 1.8时,接口中的方法可以是public的,也可以是default的,JDK 1.9时,接口中的方法可以是private的