联系
1.二者都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,在面向对象中,所有的对象都是用类来描述的,但是反过来却不是这样。并不是所有的类都是用来描述对象的,如果一个类没有包含足够的信息来描述一个具体的对象,这样的类就是抽象类。比如动物是抽象类,狗、猫是具体的对象。
2.抽象类主要是用于类型隐藏。我们可以构造出一组固定的行为描述,但是这组行为可以有任意个具体的实现方式,这个行为描述就是抽象类,具体实现就是派生类。模块可以操作这个抽象体,由于模块依赖于这个抽象体,因此他可以是允许不被修改的,通过抽象体可以派生不同的实现类,从而扩展该模块的功能。
区别
1.abstract class可以定义字段,interface不可以定义字段;
2.abstract class有默认实现,interface在JDK1.8之前没有默认实现;
3.abstract class在Java语言中表示的是一种继承关系,Java只能继承单个abstract class,但是可以实现多个interface;
4.abstract class表示的是"is a"关系,interface表示的是"like a"关系。比如说动物抽象类,有派生类:猫、狗和老鹰,其中动物类有两个共同的方法吃和睡,但是老鹰又具备一个独特的技能“飞”,因此可以有如下代码:
abstract class Animal {
abstract void eat();
abstract void sleep();
}
interface FlyAble{
void fly();
}
class Dog extends Animal{
void eat(){...}
void sleep(){...}
}
class Cat extends Animal{
void eat(){...}
void sleep(){...}
}
class Eagle extends Animal implements FlyAble{
void eat(){...}
void sleep(){...}
void fly(){...}
}
结论
abstract class和interface是Java语言中的两种定义抽象类的方式,它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概念本质的理解、对于设计意图的反映是否正确、合理,因为它们表现了概念间的不同的关系(虽然都能够实现需求的功能)。这其实也是语言的一种的惯用法,希望读者朋友能够细细体会。
参考:https://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/index.html