Java中接口和抽象类的区别

抽象类

使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体也就是没有{},抽象类不能被实例化(也就是不能用抽象类new)。

接口

接口是一系列方法的声明,是一些方法特征的集合,接口里面只有方法的声明而没有方法的实现,也就是没有方法主体,没有{},里面的方法都是由public abstract修饰的。

区别

  1. 抽象类可以有具体的方法实现,而接口是完全抽象的,不能有方法实现。
  2. 子类使用extends继承抽象类,如果子类不是抽象类的话,要实现抽象类的全部抽象方法。子类使用implements实现接口,并且要实现接口声明的全部方法。
  3. 修饰符:抽象类可以用public protected和default这些修饰符,接口方法默认修饰符是public,不可以用其他修饰符。
  4. 抽象类可以有main方法也可以运行,接口不能有main,也不能运行。
  5. 抽象方法可以继承一个类和实现多个接口,接口只可以继承一个或多个其它接口。
  6. 抽象类比接口速度要快,因为接口需要时间去寻找在类中实现的方法。
  7. 往抽象类中添加新的方法可以直接提供实现,所以可以不用改变继承抽象类的子类,而向接口添加新的方法,必须改变接口的实现类。
  8. 抽象类可以有构造方法,只是不能创建抽象类的实例化对象,接口没有构造方法,不能被实例化。

什么时候使用抽象类?什么时候使用接口?

  1. 如果拥有一些方法并且想让它们中的一些有默认实现,用抽象类。
  2. 由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。这时候可以使用接口解决问题。
  3. 如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。