抽象类和接口的区别
不同
No | 区别 | 抽象类 | 接口 |
---|---|---|---|
1 | 关键字 | abstract class | interface |
2 | 组成 | 构造方法、普通方法、抽象方法、static方法、常量、变量 | 抽象方法、全局变量 |
3 | 子类使用 | class 子类 extends 抽象类 | class 子类 implements interface |
4 | 关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,却可以继承多个父接口 |
5 | 权限 | 可以使用各种权限 | 只能使用public |
6 | 限制 | 单继承局限 | 没有单继承局限 |
相同
No | 相同 | 说明 |
---|---|---|
1 | 子类 | 抽象类和接口都必须有子类,子类必须要覆写全部的抽象方法 |
2 | 实例化对象 | 依靠子类对象的向上转型进行对象的实例化 |
JDK8新特性
JDK8对接口进行了增强,新增了默认方法和静态方法。
- 默认方法:允许接口中添加default修饰的非抽象方法,且允许在接口实现类中进行重写覆盖,通过接口实现类的实例化对象进行方法调用。
- 静态方法:允许接口中添加static修饰的非抽象方法,只能通过接口名来进行方法调用。
定义接口:
public interface Speakable {
// 默认方法
default void sayHi() {
System.out.println("Hi form interface!");
}
// 默认方法
default void sayHello() {
System.out.println("Hello form interface!");
}
// 静态方法
static void sayBye() {
System.out.println("Bye!");
}
}
定义接口实现类:
public class Person implements Speakable{
// 覆盖接口默认方法
@Override
public void sayHello() {
System.out.println("Hello from class!");
}
public static void main(String[] args) {
Person person = new Person();
person.sayHello();
person.sayHi();
// 调用接口静态方法
Speakable.sayBye();
}
}
输出:
Hello from class!
Hi form interface!
Bye!
总结
从设计角度来说:接口是为了规范类的行为,是“like-a”的关系,抽象为了类的复用,是“is-a”的关系。
抽象类支持的功能比接口更多,但有单继承局限,优先考虑使用接口。