抽象类和接口的共同点和区别
都不能被实例化
一个是类,一个是接口
一个可以被继承,一个被实现
一个只能单继承,一个可以被实现多个接口
一个可以有自己的实现,一个不可以
接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象
举例子
第一个例子:飞机和鸟
飞机和鸟不是同一类的事物,但是他们都会飞,所以应该设计一个飞机类,一个鸟类,而把会飞这个属性设计成接口。
我们不能把会飞这个属性设计成类,因为飞只是一种行为、一种特性,并不是一类事物,他不是一个真实的物品。
继承是一种 “是不是的关系” ,而接口是一种 “有没有的关系” 。
第二个例子:门和警报
门都有open和close的两个功能,所以我们可以把门设计成类或者接口
abstract class Door {
public abstract void open();
public abstract void close();
}
或者:
interface Door {
public abstract void open();
public abstract void close();
}
假如我们现在需要添加一个警报功能,
我们可以将警报alarm添加到抽象类Door中,这样一来所有继承于Door的类都获得了警报功能,但是现实中,并不是所有的门都有警报功能。
我们把这个警报alarm放到接口Door中去,这样一来所有实现了警报功能的类都要实现open和close功能,但是有些东西不需要open和close功能,比如火灾报警器。
所以,门的open close和alarm不是同一个东西。open和close是同一类范畴的东西,而警报alarm是一个拓展的功能,所以,我们最好把door设计成一个抽象类,把alarm设计成一个接口。
interface Alram {
void alarm();
}
abstract class Door {
void open();
void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() {
//....
}
void close() {
//....
}
void alarm() {
//....
}
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!