共同点:
- 都是上层的抽象层
- 都不能被实例化
不同:
抽象类可以实现方法,接口不行(除了default关键字的方法)
-
一个类只能继承一个父类,接口可以实现多个
java语言中类的继承是单继承的原因:解决C++多继承带来的问题,使得程序更加安全而接口却可以多继承,因为接口中只有抽象方法,没有静态方法和非常量的属性,只有接口的实现类才会重写接口中方法。因此一个类有多个接口也不会增加JVM的绑定机制和复杂度。
对于已经存在的继承树,可以方便的从类中抽象出新的接口,但是从类中抽象出新的抽象类就不那么容易了,因此接口更有利于软件系统的维护和重构。
接口和抽象类的设计目的不一样。接口是对动作的抽象,而抽象类是对根源的抽象。举个例子:人可以走和跳,如果是抽象类,那就包含两个方法,而接口可以将这两个方法独立开来,更加有利于解耦合。从这个意义算起来,接口的抽象程度高于抽象类。
Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。