23 08 2020

共同点

接口和抽象类都是继承的上层,他们的共同点如下:

  1. 都是上层的抽象层。
  2. 都不能被实例化。
  3. 都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,但不提供具体的实现。

不同点

  1. 接口中定义的成员变量都是公有的静态变量,抽象类中可以有普通的成员变量。

    1. abstract class A {
    2. int x = 10;
    3. }
    4. interface B {
    5. public final static int x =10;
    6. }
  2. 接口中的方法都是公有的抽象方法,抽象类中可以有普通的方法。

    1. abstract class A {
    2. public void methodA() {
    3. }
    4. }
    5. interface B {
    6. public void methodB();
    7. }
  3. JDK1.8开始,接口中允许静态方法和default修饰的默认方法拥有方法体,其实是靠近抽象类的一种体现。

    1. interface D {
    2. // static修饰符定义静态方法
    3. static void staticMethod() {
    4. System.out.println("接口中的静态方法");
    5. }
    6. // default修饰符定义默认方法
    7. default void defaultMethod(){
    8. System.out.println("接口中的默认方法");
    9. }
    10. }
  4. 接口是被普通类实现,抽象类是被普通类继承

    接口

    1. interface B {
    2. public void methodB();
    3. }
    4. class F implements B{
    5. @Override
    6. public void methodB() {
    7. }
    8. }

    抽象类

    1. abstract class A {
    2. public void methodA() {
    3. }
    4. }
    5. class C extends A {
    6. }
  5. 接口也可以继承,但是只有接口能继承接口,接口可以实现多继承,抽象类只能是单继承。

    接口

    1. interface B {
    2. public void methodB();
    3. }
    4. interface D {
    5. // static修饰符定义静态方法
    6. static void staticMethod() {
    7. System.out.println("接口中的静态方法");
    8. }
    9. // default修饰符定义默认方法
    10. default void defaultMethod(){
    11. System.out.println("接口中的默认方法");
    12. }
    13. }
    14. interface E extends B, D {
    15. }

    抽象类

    1. abstract class A {
    2. public void methodA() {
    3. }
    4. }
    5. class C extends A {
    6. }
  6. 接口中不能定义构造方法,抽象类中可以(子类构造方法中,必须调用父类的构造方法)。

    1. abstract class A {
    2. public A(){
    3. }
    4. }
    5. class C extends A {
    6. public C() {
    7. super();
    8. }
    9. }
  7. 接口可以打破单继承问题,让参数更加灵活,接口多继承,一个类还可以实现多个接口。

延伸阅读
  1. Java 代码块及代码块和构造方法的执行顺序
  2. java8新特性有哪些
  3. 抽象类(abstract class)和接口(interface)有什么异同
  4. 位运算符:与(&)、非(~)、或(|)、异或(^)
  5. 【面试题】实现打印26个数字和26个字母交替打印
发表评论