抽象类和接口是两个非常相似的类型,许多人认为这俩可以互相换着用,他们既有相似的地方,也有不同的地方,本文将带你梳理这些误区,而且用实际代码告诉你抽象类实现接口会多么的有用。

先来熟悉接口与抽象类的区别:

语法层面的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;

2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;

3)接口中不能含有静态代码块含有静态方法,而抽象类可以有静态代码块和静态方法;

4)一个类只能继承一个抽象类,而一个类却可以实现多个接口

我来解释一些重要的地方

抽象类中可以实现抽象方法和非抽象方法,可以使用所有的修饰符进行修饰,不写修饰符的时候就是包访问权限,而接口只能用public abstract,因为接口中只有类似于抽象方法的方法体,你必须对他进行实现。。。
接口是对动作的抽象,抽象类是对根源的抽象。所以在接口中含有静态代码块是不可以的,因为静态代码块中只含有表达式,所以接口是方法的集合体,这违背了他的基本原理,所以是不可以的。而静态方法在jdk1.8之前不可以实现,在jdk1.8之后就可以正常使用了。。。至于为什么这么定义,除了语法设计之外,接口也是一种特殊的类,所以在jdk1.8之后加上了静态方法。抽象类更加的具体,是一种描述的类,所以既可以实现静态代码块也可以实现静态方法。
一个类只能继承一个抽象类,而一个类却可以实现多个接口,这个不用多说吧。。
接下来开始介绍抽象类实现接口的好处。

先写一个接口

package com.company;

/**

  • ⊙﹏⊙&&&&&&⊙▽⊙
  • @Auther: pangchenbo
  • @Date: 2019/10/31 10:15
  • @Description:
  • /
    public interface heihei {
    int i=0;
    void heihei1();
    void heihei2();
    }
    然后用抽象类实现接口

package com.company;

/**

  • ⊙﹏⊙&&&&&&⊙▽⊙
  • @Auther: pangchenbo
  • @Date: 2019/10/31 10:14
  • @Description:
  • /
    public abstract class haha implements heihei {
    abstract void haha1();
    public void heihei1(){
      System.out.println("heihei");
    }
    static void hahaha(){
      System.out.println("static haha");
    }
    static {
      int a = 1;
    }
    }
    然后继承抽象类

package com.company;

/**

  • ⊙﹏⊙&&&&&&⊙▽⊙

  • @Auther: pangchenbo

  • @Date: 2019/10/31 10:19

  • @Description:

  • /
    public class heiha extends haha {
    @Override
    void haha1() {

      System.out.println("haha1");

    }

    @Override
    public void heihei2() {

      System.out.println("heihei2");

    }

    public static void main(String[] args) {

      heiha heiha = new heiha();
      heiha.haha1();
      heiha.heihei2();
      heiha.heihei1();
      System.out.println(i);
}

}
在抽象类中我们实现了heihei1方法,然后你会发现你在heiha类中继承之后只需要实现heihei2方法即可,这就让你在实现类中如果不想实现某些方法,利用抽象类进行实现,就不会出现在最后的实现类中了,是不是很nice?我想是的。哈哈