接口和抽象类的区别
-
抽象类 用 abstract class 来定义,接口用 interface 来定义
-
抽象类中可以有普通成员变量,接口中没有,接口中的变量都是被public static final 修饰的常量
-
抽象类中可以有构造方法,接口中不能有构造方法。
-
抽象类中可以包含普通方法,接口中不能有普通方法。接口中所有方法都是抽象方法。
-
抽象类中的方法的访问类型可以是 public,protected ,但接口中的抽象方法只能是 public 类型的
-
抽象类中可以包含静态方法,接口中不能包含静态方法。(注:JDK1.8后 接口中可以有静态方法,但是必须要有方法体,可以使用接口名直接调用。实现类不能实现该方法)
-
一个类可以实现多个接口,但只能继承一个抽象类。
-
接口的作用更多在于 定义规范和约定。而抽象类在代码实现方面发挥作用,可以实现代码的重用。
-
接口中可以有默认实现方法。 方法只需要用default来修饰。实现类不需要实现该方法,可以直接调用。
比如:
public interface Animal { // 吃方法,实现类需要实现 void eat(); // 跑方法,实现类不需要实现,可以直接调用 default run(){ System.out.println("动物跑。。。默认实现"); } }
接口中 静态方法 和 默认实现方法 的区别:
- 接口中使用static修饰的方法,是静态方法。必须要有方法体。可以使用接口名直接调用。实现类无法重写该方法,实现类也不能调用该方法。
- 接口中使用default修饰的方法,是默认实现方法。必须要有方法体。不能通过接口名直接调用。实现类可以实现该方法,也可以不实现。使用方式: 通过实现类的实例来调用。
- | 修饰词 | 方法体 | 子类实现 | 调用方式 |
---|---|---|---|---|
静态方法 | static | 必须有 | 无法实现 | 只能通过接口调用 |
默认方法 | default | 必须有 | 选择性实现 | 只能通过实现类调用 |