抽象类和接口的区别
抽象类和接口的区别
首先明白他们的使用场景?
- 如果拥有一些方法,想要让它们有默认的具体实现,选择抽象类
- 如果想要实现多重继承,Java中不支持多继承,但是一个类可以实现多个接口,选择接口
- 如果有一些基本功能在不断发生变化,选择抽象类,如果使用接口,每次变更都需要去更改实现接口的所有类
抽象类 | 接口 |
---|---|
它可以有默认的方法实现 | 接口是完全抽象的,不存在方法的实现 |
子类提供extends关键字来继承抽象类,并且子类不是抽象类的话,需要实现抽象类中声明的方法 | 子类使用关键字implements来实现接口,需要实现接口中声明的方法 |
抽象类中的成员变量可以是各种类型的 | 接口中的成员变量只能是public static final(隐式声明)类型(必须在声明时赋值) |
抽象类中可以有静态代码块和静态方法 | 接口中不能含有静态代码块和静态方法(含有静态变量) |
一个类只能继承一个抽象类 | 一个类可以实现多个接口 |
抽象方法中可以有public、protected、default这些修饰符 | 接口方法默认是public abstract |
疑问:jdk1.8之后接口有默认的方法(default修饰),那么它也可以当作基本功能实现的方法呀?
我觉得最主要的原因是即使有默认方法,但是接口它没有字段(成员变量)和构造方法,这个默认方式实现的功能非常有限,因此代码复用性很差,并且抽象类它可以在不同的具体类之间共享代码。如:
1 | abstract class Animal { |
在
Main
类中,我们分别创建了一个Dog
对象和一个Cat
对象,并分别调用了它们的方法。由于它们继承了抽象类Animal
,所以可以访问共享的字段和默认方法。
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.