- 类是一个模板,是对一系列具有相同属性和方法的对象的描述;如果一个类含有抽象方法或者被声明为abstract,则称这个类为抽象类。
类与抽象类的主要区别在于:
1、抽象方法必须为public或者protected,缺省情况下默认为public。
2、抽象类不能用来创建对象:抽象类创建对象其实没有任何意义。
3、如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
- 接口是一种声明的集合,是一种声明的规范,里面只能包含抽象方法。
接口与抽象类的主要区别有:
1、语法层面的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
5)抽象类可以有构造方法,而接口不可以有构造方法。
2、设计层面的区别
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。比如,老虎和牛都能吃东西,在设计时可以将老虎设计为一个类Tiger,牛设计为一个类Cow,但吃不能设计为一个类,因为它是行为特性而不是对一类事物的抽象描述,可以将吃设计为接口Eat,包含eat()方法
2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。PPT模板就是模板式设计,对模板做的修改也会出现在应用该模板的全部PPT中,而辐射式设计则需要对每个子类都进行更改
门和报警的例子:门都有open( )和close( )两个动作,可以定义通过抽象类和接口来定义这个抽象概念:
// 抽象类
abstract class Door {
public abstract void open();
public abstract void close();
}
//接口
interface Door {
public abstract void open();
public abstract void close();
}
但是现在如果需要门具有报警alarm( )的功能,有两种思路来实现:
1)将这三个功能都放在抽象类里面,所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承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() {
//....
}
}
网友评论