本文参考自——牛客题库-Java校招面试题汇总
从定义上说
- 接口中所有的方法隐含的都是抽象的;而抽象类则可以同时包含抽象和非抽象的方法。
- Java中只支持单继承。对于接口来说,类可以实现多个接口;但只能继承自一个抽象类。
- 接口中声明的变量(成员属性)都是
final
的;而抽象类可以包含非final
的变量(成员属性)。 - 接口中的成员函数(成员方法)默认是
public
的;而抽象类的成员函数(成员方法)可以是private
、protected
和public
。 - 接口是绝对抽象的,不可以被实例化;抽象类也不可以被实例化。
- 类可以不实现抽象类和接口中声明的所有方法,但在此情况下,该类必须得声明为抽象类。
- 基于上一条,抽象类可以在不提供接口方法实现的情况下实现接口。即,普通类实现了一个接口,则必须给出该接口内所有方法的具体实现;而抽象类实现接口,可以不在该抽象类内部给出接口中方法的实现,但若某普通类继承自该抽象类,必须给出该接口中所有方法的具体实现。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25interface A {
void f();
}
abstract class B implements A {
public abstract void g();
}
public class C extends B {
/**
* 这里的f()方法必须被声明为public的,因为接口中的方法签名默认为public
*/
public void f() {
...
}
/**
* 这里g()方法的访问权限不能小于原方法签名所声明的权限,如原方法声明为public,这里就不能使用protected等public以下的关键字修饰
*/
public void g() {
...
}
}
从设计层面来说
- 抽象类是对类的抽象,是一种模板设计。
- 接口是对行为的抽象,是一种行为的规范。