抽象类和接口的区别

抽象类(抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法)

  • 抽象类中可以构造方法
  • 抽象类中可以存在普通属性,方法,静态属性和方法。
  • 抽象类中可以存在抽象方法。
  • 如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
  • 抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。

接口

  • 在接口中只有方法的声明,没有方法体。 (Java8 接口可以有实例方法)
  • 在接口中只有常量,因为定义的变量,在编译的时候都会默认加上 public static final (必须被初始化,不能改变)
  • 在接口中的方法,永远都被public来修饰(只能)。
  • 接口中没有构造方法,也不能实例化接口的对象。
  • 接口可以实现多继承实现
  • 接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法则实现类定义为抽象类。

区别:

  • 接口中的所有方法都是抽象的,而抽象类中的方法可以被实现
  • 接口中的变量只能是private static final (私有静态常量),而抽象类可以包含非final的变量
  • 接口中的方法只能被public abstract修饰,而抽象类可以被public protected private 修饰
  • 接口中的方法不可以被static修饰
  • 类可以实现多个接口,而只能继承一个抽象类
  • 接口可以继承接口,但不可以继承类(普通类和抽象类)因为抽象类有可以有方法的实现等等,抽象类都可以继承
  • 非抽象类实现一个接口,必须实现它的所有方法,但抽象类的话可以实现一部分。

接口和抽象类的相同点

  • 都可以被继承
  • 都不能被实例化
  • 都可以包含方法声明
  • 派生类必须实现未实现的方法

PS:

  • 静态方法不能被重写,不能被抽象
  • 本地方法是本地代码实现的方法,不能是抽象
  • synchronize与方法的实现细节有关,抽象方法不能被synchronize修饰
  • 抽象类中可以定义一些子类的公共方法,子类只需要增加新的功能,不需要重复写已经存在的方法。而接口中只是对方法的申明和常量的定义。
原文地址:https://www.cnblogs.com/heyjia/p/11338365.html