Java接口和抽象类的区别

    |     2015年4月1日   |   Java面向对象高级特性   |     0 条评论   |    1804

类是对象的模板,抽象类和接口可以看成具体类的模板。接口从某种角度看是一种特殊的抽象类,相似处很多,选择时容易混。先看相同点,再看各自擅长什么。

使用引用变量时,尽量用类结构的抽象层,让方法的定义和实现分离,代码才能松散耦合。

对比 抽象类 接口
实例化 不能 new 不能 new
抽象方法 可以有,也可以全是具体方法 经典形态全是抽象方法
代码复用 可提供部分实现,子类不用重复写 Java 8 前不能给实现;之后才有 default
继承关系 一个类只能有一个直接父类 一个类可以实现多个接口
适用 既要约束行为,又要提供通用功能 定义行为模型、可插入能力

一、相同点

  • 都代表类树里的抽象层,适合作为引用类型。
  • 都不能被实例化。
  • 都能包含抽象方法:描述系统提供哪些功能,不必关心具体实现。

二、抽象类能复用实现,接口偏契约

抽象类可以为部分方法提供实现,避免子类重复编写,这是它的优势。接口在 Java 8 之前只能包含抽象方法,不能带任何实现(之后可用 default 方法补公共行为,但经典对比仍按“纯契约”来理解)。

public abstract class A {
    public abstract void method1();
    public void method2() {
        // A method2:子类直接复用
    }
}
public class B extends A {
    public void method1() { /* B method1 */ }
}
public class C extends A {
    public void method1() { /* C method1 */ }
}

A 的子类 B、C 不必重写 method2,A 为它们提供了公共功能,也约束了行为。method1 没有实现,B、C 按自己的特点写,体现松散耦合。

public interface A {
    public void method1();
    public void method2();
}
public class B implements A {
    public void method1() { /* B method1 */ }
    public void method2() { /* B method2 */ }
}
public class C implements A {
    public void method1() { /* C method1 */ }
    public void method2() { /* C method2 */ }
}

接口 A 无法为 B、C 提供现成的 method2,两个方法都得各自实现一遍。A 约束的是“必须有这些方法”,不管具体怎么写。

三、单继承 vs 多实现

一个类只能继承一个直接父类(可以是抽象类),但可以实现多个接口,这是接口的优势。

interface A { public void method2(); }
interface B { public void method1(); }
class C implements A, B {
    public void method1() { /* C method1 */ }
    public void method2() { /* C method2 */ }
}
A a = new C();
B b = new C();

C 还可以继续实现别的接口。若改成两个抽象类叠在一起,C 继承了 B(B 再继承 A)之后,就没有机会再继承其他父类了:

abstract class A {
    public abstract void method1();
}
abstract class B extends A {
    public abstract void method2();
}
class C extends B {
    public void method1() { /* C method1 */ }
    public void method2() { /* C method2 */ }
}

四、怎么选

行为模型应通过接口而不是抽象类来定义,所以通常优先选接口,少用抽象类。选抽象类的典型情况是:既要定义子类行为,又要为子类提供通用实现。

一句话总结:要可插入的能力契约用接口(可多实现);既要契约又要把公共代码放进父类,用抽象类(只能单继承)。

转载请注明来源:Java接口和抽象类的区别
本文链接地址:https://ai.zhousir.top/?p=126
回复 取消