核心区别
调用者使用动机不同,实现接口是为了使用他规范的某一个行为;
继承抽象类是为了使用这个类属性和行为.
思想层面
设计思想不同. 设计抽象类是自下而上的过程,因为调用者子类需要某些属性和特有行为,所以调用者继承抽象类
设计接口是自上而下的过程,接口规范某一行为,我某类需要这个行为,调用者实现某接口、
代码层面
- 定义关键字不同,接口用
interface
,抽象类用abstract class
- 继承使用不同的关键字,接口用
implements
,抽象类用extends
- 接口可以多实现,抽象类只能单继承
//接口
interface A {}
class B implements A {}
class C implements A {}
//抽象类
abstract class D {}
class E extends D {}
class F extends D {} //错误,抽象类只能单继承
- 接口属性只能是
public static final
,抽象类属性可以是各种访问修饰符
//接口
interface A {
public int x = 1;
}
//抽象类
abstract class B {
public int x = 1;
protected int y = 2;
private int z = 3;
}
- 接口方法默认是
public
,抽象类方法可以是各种访问修饰符
//接口
interface A {
void method1(); //默认public
public void method2();
//private void method3(); //错误
}
//抽象类
abstract class B {
public abstract void method1();
void method2() {} //默认访问修饰符
private void method3() {}
}
- 接口不能有方法实现,抽象类可以有非抽象方法的实现
//接口
interface A {
static void method1() {} //正确
default void method2() {} //正确
void method3(); //错误,不能有实现
}
//抽象类
abstract class B {
abstract void method1(); //错误,不能有实现
void method2() {} //正确
static void method3() {} //正确
}
- 接口不能有静态代码块和构造方法,抽象类可以有
//接口
interface A {
//静态代码块 //错误
}
//抽象类
abstract class B {
static {
// 静态代码块
}
}