Skip to content

面试速答(先看这里)

**一句话结论:**接口(Interface)和抽象类(Abstract Class)是面向对象编程中两个非常重要的概念,它们都可以用来实现抽象层。

60秒标准回答:

接口(Interface)和抽象类(Abstract Class)是面向对象编程中两个非常重要的概念,它们都可以用来实现抽象层

接口和抽象类的区别其实挺多的。比如以下这些

方法定义: 接口和抽象类,最明显的区别就是接口只是定义了一些方法而已,在不考虑Java8中default方法情况下,接口中只有抽象方法,是没有实现的代码的。(Java8中可以有默认方法)

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**接口和抽象类的区别其实挺多的。
  • **要点2:**方法定义: 接口和抽象类,最明显的区别就是接口只是定义了一些方法而已,在不考虑Java8中default方法情况下,接口中只有抽象方法,是没有实现的代码的。
  • **要点3:**继承和实现 :接口可以被实现,抽象类可以被继承。
  • **要点4:**单继承,多实现 :一个类可以实现多个接口,但只能继承一个抽象类。
  • **要点5:**一般在实际开发中,我们会先把接口暴露给外部,然后在业务代码中实现接口。

**记忆锚点:**抽象类 → 接口和抽象类 → default → public → Java8 → 最明显的区别就是接口

易错提醒:

  • 抽象类不能直接被实例化(new)出来,但是构造器也是有意义的,能起到初始化共有成员变量、强制初始化操作等作用。
  • 接口不能有构造器。

加分表达:

  • (接口中,如果定义了成员变量,还必须要初始化) 构造器 :抽象类可以有构造器。
  • 如果多个实现类中有相同可复用的代码,则在接口和实现类中间加一层抽象类,将公用部分代码抽出到抽象类中。

追问准备:

  • 围绕「抽象类」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「接口和抽象类」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「default」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

接口(Interface)和抽象类(Abstract Class)是面向对象编程中两个非常重要的概念,它们都可以用来实现抽象层。

接口:

java
public interface PayService {
    public void pay(PayRequest payRequest);
}

抽象类:

java
public abstract class AbstractPayService implements PayService {

    @Override
    public void pay(PayRequest payRequest) {
      	//前置检查
        validateRequest(payRequest);
      	//支付核心逻辑
        doPay(payRequest);
      	//后置处理
        postPay(payRequest);
    }

    public abstract void doPay(PayRequest payRequest);

    private void postPay(PayRequest payRequest) {
        //支付成功的后置处理
    }

    public void validateRequest(PayRequest payRequest) {
        //参数检查
    }
}

接口和抽象类的区别其实挺多的。比如以下这些:

**方法定义:**接口和抽象类,最明显的区别就是接口只是定义了一些方法而已,在不考虑Java8中default方法情况下,接口中只有抽象方法,是没有实现的代码的。(Java8中可以有默认方法)

修饰符:抽象类中的修饰符可以有public、protected和private和<default>这些修饰符,而接口中默认修饰符是public。不可以使用其它修饰符。(接口中,如果定义了成员变量,还必须要初始化)

java
public abstract class Test {
    public String a;

    private String b;

    String c;

    protected String d;
}

构造器:抽象类可以有构造器。接口不能有构造器。

> 抽象类不能直接被实例化(new)出来,但是构造器也是有意义的,能起到初始化共有成员变量、强制初始化操作等作用。

继承和实现:接口可以被实现,抽象类可以被继承。

单继承,多实现:一个类可以实现多个接口,但只能继承一个抽象类。接口支持多重继承,即一个接口可以继承多个其他接口。

java
public interface HollisTestService extends InitializingBean, DisposableBean {}

职责不同:接口和抽象类的职责不一样。接口主要用于制定规范,因为我们提倡也经常使用的都是面向接口编程。而抽象类主要目的是为了复用,比较典型的就是模板方法模式。

所以当我们想要定义标准、规范的时候,就使用接口。当我们想要复用代码的时候,就使用抽象类。

一般在实际开发中,我们会先把接口暴露给外部,然后在业务代码中实现接口。如果多个实现类中有相同可复用的代码,则在接口和实现类中间加一层抽象类,将公用部分代码抽出到抽象类中。可以参考下模板方法模式,这是一个很好的理解接口、抽象类和实现类之间关系的设计模式。

📄 ✅什么是模板方法模式,有哪些应用?

打开文档:✅什么是模板方法模式,有哪些应用?