抽象类和接口的区别
在 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
修饰,它除了默认方法外所有的抽象方法都要被子类实现。
抽象类和接口如何选择
如果没有特别必要,我的意见是不要为代码引入额外的结构,如果常规类就可以解决问题,那么就不要使用接口或者抽象类,如果必须要使用,可以优先选择接口。抽象类相比接口,会更增加代码的复杂性,可以最后考虑。