参考: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();
}

假如我们现在需要添加一个警报功能,

  1. 我们可以将警报alarm添加到抽象类Door中,这样一来所有继承于Door的类都获得了警报功能,但是现实中,并不是所有的门都有警报功能。

  2. 我们把这个警报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 协议 ,转载请注明出处!

CopyOnWriteArrayList的优点及原理 上一篇
Android源码阅读导图 下一篇