Java Basic Three

抽象类

存在只定义了方法的签名,没有方法的类称为抽象类。

  • 抽象类和抽象方法使用 abstract 修饰
  • 抽象类不能实例化
  • 抽象类可以没有抽象方法,可以有非抽象方法
  • 抽象类可以有成员变量、方法(抽象方法和非抽象方法)、构造器、初始化块、内部类(接口、枚举)
  • 含有抽象方法的类(定义了一个抽象方法的类、继承一个抽象方法但是没有完全实现父类中抽象的方法的类、实现一个接口但是没有完全实现接口中的方法)只能为抽象类

abstract 不能修饰成员变量和类方法,因为成员变量属于类实例,而抽象类不能实例化,抽象方法没有方法体,调用出错。

抽象类的作用

抽象类是将多个子类向高层抽象,为子类提供行为模板,定义了子类中存在的共有行为。

接口

接口进一步将抽象类抽象。

接口定义了多个类共同的公共行为规范。

接口中不能含有

  1. 构造器
  2. 初始化块

但是接口中包含:

  1. 成员变量(只能是静态)
  2. 方法(抽象实例方法、类方法、默认方法)
  3. 内部类(内部接口、枚举)

接口中的成员

接口中的所有成员的访问权限为 public
对于接口中的静态常量而言,它们是接口相关的,系统会自动为这些成员变量增加 static 和 final 两个修饰符,必须在定义时进行初始化。

接口中的默认方法、静态方法

接口中的默认方法和静态方法都可以实现,拥有方法体。

在 Java8 之前接口中的所有方法均为抽象方法,但是在 Java8 后系统为接口增加了默认方法,此方法增加了接口的可扩展性,如果需要在已有业务上需要为接口增加新的方法来实现增加业务的目的。那么 Java8 之前如果为接口增加方法,那么所有实现类均需要更改。在 Java8 后增加而 默认方法,实现类不是必须要实现该方法,如果实现了没有显示实现该方法,那么调用时使用默认实现。

而接口中的静态方法,需要通过接口名实现调用,在默认方法中可以调用本类的默认方法。

接口的实现

一个类实现了一个接口后,这个类需要实现这个接口中的所有抽象方法,否则,这个类将保留从接口继承的抽象方法,则这个类必须定义为抽象类

抽象类和接口

同:

  1. 不能被实例化,只能被其他类继承或实现。
  2. 都可以包含抽象方法,实现或继承的子类需要实现这些抽象方法。

异:

接口作为系统与外界交互的窗口,接口体现的是一种规范,对于接口的实现者来说,接口规定了实现者必须向外提供哪些服务(以方法的形式);对于接口的调用者来说,接口规定了可以调用哪些服务,以及如何调用服务(如何调用方法)。

抽象作为系统中多个子类的共同父类,它体现的是一种模板式设计。