本文参考自——牛客题库-Java校招面试题汇总

从定义上说

  • 接口中所有的方法隐含的都是抽象的;而抽象类则可以同时包含抽象和非抽象的方法。
  • Java中只支持单继承。对于接口来说,类可以实现多个接口;但只能继承自一个抽象类。
  • 接口中声明的变量(成员属性)都是final的;而抽象类可以包含非final的变量(成员属性)。
  • 接口中的成员函数(成员方法)默认是public的;而抽象类的成员函数(成员方法)可以是privateprotectedpublic
  • 接口是绝对抽象的,不可以被实例化;抽象类也不可以被实例化。
  • 类可以不实现抽象类和接口中声明的所有方法,但在此情况下,该类必须得声明为抽象类。
  • 基于上一条,抽象类可以在不提供接口方法实现的情况下实现接口。即,普通类实现了一个接口,则必须给出该接口内所有方法的具体实现;而抽象类实现接口,可以不在该抽象类内部给出接口中方法的实现,但若某普通类继承自该抽象类,必须给出该接口中所有方法的具体实现。代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    interface A {
    void f();
    }

    abstract class B implements A {
    public abstract void g();
    }

    public class C extends B {
    /**
    * 这里的f()方法必须被声明为public的,因为接口中的方法签名默认为public
    */
    @Override
    public void f() {
    ...
    }

    /**
    * 这里g()方法的访问权限不能小于原方法签名所声明的权限,如原方法声明为public,这里就不能使用protected等public以下的关键字修饰
    */
    @Override
    public void g() {
    ...
    }
    }

从设计层面来说

  • 抽象类是对类的抽象,是一种模板设计。
  • 接口是对行为的抽象,是一种行为的规范。