抽象类和接口的区别详解

概念

类:是一个模板,它描述一类对象的行为和状态。

对象:是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

接口:是抽象方法的集合,包含类要实现的方法。

抽象类:如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

举例

Eg:门的种类有很多,防盗门具有警报器,有些门没有报警器,但是门都具有开和关的属性,是门本身固有的特性我们可以Door 设计为单独的一个抽象类,包含 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() {
      //....
    }
}

区别(面试题)

1)语法层面

1. java中的类是单继承的,一个类只能继承一个抽象类,而一个类却可以实现多个接口。

2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。

3. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。

4. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。

注:JDK 1.8 以后,接口里可以有静态方法和方法体了。

2)设计层面

抽象类,它是一种模板式设计。接口,它是一种辐射式设计

什么是模板式设计?最简单例子,大家都用过 ppt 里面的模板,如果用模板 A 设计了 ppt B 和 ppt C,ppt B 和 ppt C 公共的部分就是模板 A 了,如果它们的公共部分需要改动,则只需要改动模板 A 就可以了,不需要重新对 ppt B 和 ppt C 进行改动。而辐射式设计,比如在几个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。

也就是说如果需要添加新的方法,对于抽象类,可以直接在抽象类中添加具体的实现而无需改变子类,而对于接口,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动

补充:

接口实例:飞机和鸟他们是不同的事物,但是它们都有一个共性,飞。那么在设计的时候,可以将飞机设计为一个类 Airplane,将鸟设计为一个类 Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。

实战:

抽象类和接口一起在策略模式中的使用实战,请查看我的另一篇文章——策略模式实战中多种写法,中的实例一

接口的默认方法实战,请查看我的另一篇文章——java8接口默认方法实战

原文地址:https://www.cnblogs.com/liaowenhui/p/12258767.html