语法上的区别:
1.抽象类中的成员变量可以是各种类型的,而接口中的只能是public static final的;
2.抽象类中的成员方法可以实现,而接口中的只能是抽象方法;
3.一个类只能继承一个类,而可以实现多个接口。
使用上的区别:
1.抽象类是对类进行抽象,而接口是对具体的行为进行抽象;
2.抽象类是你”是不是“的关系;
而接口是你“有没有”的关系;你有你就实现,你没有你就不用实现;
3.抽象类需要新的方法,直接在抽象类中具体的实现;
而接口进行变更,所有实现这个接口的类都要进行变更。
如下例子:可以帮你更好的理解抽象类和接口
https://www.cnblogs.com/dolphin0520/p/3811437.html
门和警报的例子:门都有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() {
//....
}
}