一,谈谈你对abstract和Interface的区别
首先,abstract和interface是java的两种抽象机制,真应为这两种机制使得java有了面对对象的强大生命力。abstract和interface有着不少的相识之处,但也有不少的不同之处,主要从语法和问题领域上的区别,后者是本质的区别。
1,语法上来说,abstrac 可以有构造函数,而interface 不行, abstract 可以有私有的,实现的方法,而interface只能是public abstrac的方法,接口中不用指明;抽象类中也可以有私有成员变量而interface中 abstract final的。子类只能继承一个类但可以继承多个接口。
,2,从问题领域上的区别是:抽象类要求子类和父类在概念上保持一致:是is a 的关系,而在接口中,不要求实现接口的类和接口保持一致,接口就是一个契约,要求实现它的类能够实现功能,是 like a的关系。
最后举出一个例子来更加清楚的理解它们之间的区别。
比如说,我们要设计一个门,它拥有open() 和 close() 的方法,如何设计呢,门是一个抽象的概念,当然我们可以用abstract 和 interface来定义
abstrac Class Door interface Door
{ {
abstract void open(); void open();
abstract void close(); void close();
} }
但是如果一种门具有Alarm的功能,如何设计呢。本例中主要探讨abstract和interface在设计理念上的区别,其它的问题不考虑。想给出
abstrac Class Door interface Door
{ {
abstract void open(); void open();
abstract void close(); void close();
abstract void alarm(); void alarm():
} }
class alarmDoor extends Door
{
void open(){}
void close(){}
void alarm();
}
但是这样会带来一个问题,Door的固有的方法和Alarm的方法混在一起,会因为alram()方法的改变例如参数而改变Door,违反了ISP原则。
我门设计的时候吧 AlarmDoor在概念上是Door ,而拥有Alarm的功能。
我们可以这样: interface Alarm {
void alarm() }
class alarmDoor extends Door implements Alarm
{
void open(){}
void close(){}
void alarm(){}
}
这个较好的反映了我们的设计意图,如果我们把 alarmDoor理解为它是一个Alarm 拥有了door的功能,则可以反过来。