JAVA的抽象类和接口

603 阅读3分钟

抽象类

  • 抽象类用abstract声明,抽象类不可以直接实例化,但是可以实例化抽象类的子类,
  • 抽象类可以包含抽象方法也可以包含抽象方法,抽象方法不需要具体实现
  • 只是一个占位作用,需要由其子类去实现,抽象类非常适合于模板方法模式。
  • 子类中的抽象方法不能与父类的抽象方法同名
  • abstract不能与final并列修饰同一个类
  • abstract 不能与private、static、final或native并列修饰同一个方法

接口

首先接口不是类,接口是对类的一组需求的描述,是一种对行为的抽象,要求实现类遵守接口定义的规范来进行描述。
  • 接口中的方法自动属于public
  • 接口中可以包含常量,常量自动属于public static final
  • 一个接口可以继承多个接口
  • 一个类可以实现多个接口
  • 接口中可以有多个static方法,static方法由接口直接调用,不能被实现
  • 接口中可以增加写default方法,default方法是接口定义的方法默认的实现,实现类如果实现了这个方法那么调用实现类的,没有实现就调用这个默认的,default不是强制实现的,所以这个可以解决一个接口发布之后,新增加功能的时候导致旧的实现类无法编译的问题。

为什么有了抽象类还要有接口呢?

从语法的角度看

  • 接口是对一类行为的抽象,一个类可以实现多个接口,但是类只能继承一个抽象类,这样如果一个类需要满足多种抽象特征的时候,抽象类就不能满足需求了。但是类却可以实现多个接口来达到这个目的,非常方便类的拓展。

从设计理念看

  • 抽象类用于继承,继承解决的是一类事务具有相同的特征,这些特征可以抽象出来,作为一个公共特征,这个具有公共特征的类就是父类,子类可以继承父类的这些公共特征,也可以对这些公共特征进行稍微的修改,父类和子类其实是同类事务,并且存在一定的关系。比如鸟类和燕子,他们都具有一个共同特征可以飞,那么要表示鸟类和燕子的关系那么就适合使用继承关系。抽象类在这种继承模式下可以重新出很多公共代码,用于复用,极大提高了代码的复用性.
  • 接口描述的是一类行为规则,定义的是一系列的行为,比如鸟类和飞机都能够飞,那么飞行就是他们共同的行为,我们可以定义这样一个Fly接口,这个接口用来描述飞行的行为,所有能够飞行的事物都可以实现这个接口,但是他们之间并不存在什么父子关系。