abstract class 和 interface是Java语言中对于抽象类定义进行支持的两周机制,正是由于这两周机制的存在,才赋予了Java强大的面向对象的能力。abstract class和interface之间对抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因为很多developer在进行抽象类定义时对于abstract calss 和interface的选择显得比较随意,其实两者之间还是有很大区别的。
(1)语法定义层面
abstract class Demo {
abstract void func1();
abstract void func2();
private void func3() {
}
}
interface Demo {
void func1();
void func2();
}
在abstract class方式中,Demo可以有abstract数成员,也可以有非abstract数据成员和方法, 而在interface方式实现中,Demo只能有static final的数据成员,但在interface中一般不定义数据成员,而且所有的成员方法都是abstract的。
abstract class在Java语言中表示的是一种继承关系,Java类只能实现单继承,但是,却可以实现多个interface。
(2)设计理念层面
abstract class在Java中体现的是一种继承关系,父类和派生类之间必须存在“is-a”关系,即父类和派生类在概念本质上应该是相同的。
但是interface则不然,并不要求interface的实现者和inferface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。