共同点
- 都不能被实例化
- 都可以包含抽象方法(抽象方法: 用 abstract 关键字修饰的方法)
区别
- 抽象类定义的关键字是
abstract class
,接口定义的关键字是interface
- 是否允许包含非抽象方法:抽象类中允许同时存在抽象方法和非抽象方法;而接口 JDK1.8 之前只能有抽象方法,但是 JDK1.8 的时候,允许有 default 默认方法
// 抽象类
abstract class A{
// 抽象方法
abstract void add();
// 非抽象方法
void sub(){}
}
// 接口
interface B {
// 默认方法
default void add() {
}
}
- 是否存在构造方法:抽象类可以有构造方法,但不能使用 abstract 修饰;而接口没有构造方法
- 访问修饰符不同:抽象类中的抽象方法可以用 public、protected、default 修饰;接口默认是public、不能用别的修饰符去修饰(接口中的变量被隐式指定为
public static final
,方法被隐式指定为public abstract
)。注意 JDK 1.8 可以有 default 方法
// 接口
interface D {
int num = 1; // 等价于 public static final int num = 1;
void add(); // 等价于 public abstract void add();
default void sub() {
}
}
- 是否可包含静态方法:抽象类可以有非抽象的 static 方法,但不允许有抽象 static 方法;接口在 JDK1.8(即 Java8)时才有 static 方法。
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的
- 单继承,多实现。抽象类只能继承一个父类,因为 Java 的类是单继承的;而一个接口可以继承多个父接口,同时,一个类可以实现多个接口。
- 抽象类主要用于代码复用,强调的是所属关系。接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。
练习题
以下的练习题来自牛客网
1. (多选题)Java7特性中,abstract class和interface有什么区别。
A. 抽象类可以有构造方法,接口中不能有构造方法
B. 抽象类中可以有普通成员变量,接口中没有普通成员变量
C. 抽象类中不可以包含静态方法,接口中可以包含静态方法
D. 一个类可以实现多个接口,但只能继承一个抽象类。
2. (多选题)在JDK1.7中,下述说法中抽象类与接口的区别与联系正确的有哪些?
A. 抽象类中可以有普通成员变量,接口中没有普通成员变量。
B. 抽象类和接口中都可以包含静态成员常量。
C. 一个类可以实现多个接口,但只能继承一个抽象类
D. 抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法。
3.(多选题)jdk1.8中,下面有关java 抽象类和接口的区别,说法错误的是?
A. 抽象类可以有构造方法,接口中不能有构造方法
B. 抽象类中可以包含非抽象的普通方法,接口中的方法必须是抽象的,不能有非抽象的普通方法
C. 一个类可以实现多个接口,但只能继承一个抽象类
D. 接口中可以有普通成员变量,抽象类中没有普通成员变量
答案解析
1. ABD
ABD 均正确。C 错误,抽象类中可以包含静态方法,在 JDK1.7(Java7)接口中不能包含静态方法,JDK1.8 之后可以包含。
2. ABCD
在 JDK1.7 中,ABCD 的说法都是正确的。
3. BD
在 JDK1.8 中,接口可以有非抽象的方法,如 default、static 方法,所以B是错的。抽象类可以有普通成员变量,所以 D 错误。
参考