抽象类和接口的区别

在 Java 8 之后,我们发现可以在接口中添加默认方法,这让接口和抽象类的区别进一步模糊了。

比如包含默认方法的接口:

package com.wdbyte.oop.interfac;

public interface IterfacePerson {
    default void sayHello(){
        System.out.println("say hello");
    }
     void sleep();
}

包含抽象方法的抽象类:

package com.wdbyte.oop.abs;

public abstract class AbsPerson {

    public void sayHello() {
        System.out.println("say hello");
    }

    public abstract void sleep();
}

可见抽象类和具有默认方法的接口非常相似,那么它们之间有什么区别呢?

抽象类和接口的区别

特性 接口 抽象类
组合 可以继承多个接口 只能继承一个抽象类
构造函数 不能有构造函数 可以有构造函数
权限控制 默认 public 可以为 protected
属性 不能包含非静态属性 可以包含任意属性
方法 只能定义抽象方法和默认方法 可以随意定义方法和抽象方法
目的 接口表示一种规范,一组行为的抽象 通常是为了代码复用

可见,接口和抽象类最大的不同是,抽象类仍然是一个类,它具有类的很多特性,如构造函数,属性,单继承,代码复用等。

而接口更加符合行为的抽象这个限制。它的属性都是被 public static final 修饰,它除了默认方法外所有的抽象方法都要被子类实现。

抽象类和接口如何选择

如果没有特别必要,我的意见是不要为代码引入额外的结构,如果常规类就可以解决问题,那么就不要使用接口或者抽象类,如果必须要使用,可以优先选择接口。抽象类相比接口,会更增加代码的复杂性,可以最后考虑。