接口与抽象类

一、接口

接口的概念
在Java语言中,接口有两种意思:

  • 一是指概念的接口,即指系统对外所提供的所有服务。类的所有能被外部使用者访问的方法构成了类的接口。
  • 二是指用interface关键字定义的实实在在的接口,也称为接口类型。它用于明确地描述系统对外提供的所有服务,他能够更加清晰地把系统的实现细节与接口分离。

在这里介绍的是接口类型。

接口的基本特性

  1. 接口中的成员变量默认都是public、static、final类型的,必须被显式初始化。并且接口中中只能包含public、static、final类型的成员变量。(即只能包含公共的静态常量)
  2. 接口中的方法默认都是public、abstract类型的。
  3. 在JDK1.8以前的版本中,接口只能包含抽象方法。从JDK1.8开始,为了提高代码的可重用性,允许在接口中定义默认方法和静态方法。默认方法用default关键字来声明,拥有默认的实现。接口的实现类即可以直接访问默认方法,也可以覆盖它,重新实现该方法。
  4. 接口没有构造方法,不能被实例化。
  5. 一个接口不能实现另一个接口,但它可以继承多个其他接口。
  6. 与子类继承抽象类父类相似,当类实现了某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类
  7. 不允许创建接口的实例,但允许定义接口类型的引用变量,该变量引用实现了这个接口的类的实例。
  8. 一个类只能继承一个直接的父类,但能实现多个接口。

二、abstract修饰符

abstract修饰符可用来修饰类和成员方法:

  • 用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象层不能被实例化,即不允许创建对象类本身的实例。没有用abstract修饰的类称为具体类,具体类可以被实例化。
  • 用abstract修饰的方法表示为抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不能提供具体的实现。没有用abstract修饰的方法称为具体方法,具体方法有具体方法体。

抽象类的特性

  1. 抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中的所有抽象方法,那么子类也必须定义为抽象类。
  2. 没有抽象静态方法。(static和abstract关键字不能在一起使用)
  3. 抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法,但是抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。
  4. 抽象类及抽象方法不能被final修饰符修饰。(abstract修饰符不能与final修饰符连用)–抽象类只有允许创建其子类,它的抽象方法才能被实现,并且只有它的具体子类才能被实例化,而用final修饰的类不允许拥有子类,用final修饰的方法不允许被子类方法覆盖。
  5. 抽象方法不能被private修饰符修饰。

三、抽象类与接口的比较

相同点

  1. 代表系统的抽象层
  2. 都不能被实例化
  3. 都能包含抽象方法
  4. 从JDK8版本开始,不仅抽象类能为部分方法提供默认的实现,接口也具有这一个特性

*不同点

类上

  • 一个类可以实现多个接口,但只能继承一个抽象类

属性上

  • 抽象类中可以有普通成员变量,接口中没有普通成员变量
  • 抽象类和接口中都可以有静态变量,抽象类中的静态成员变量的访问类型是可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。

方法上

  • 抽象类可以有构造方法,接口中不能有构造方法。
  • 抽象类中可以包含有非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法
  • 抽象类中的抽象方法的访问类型可以是public、protected。但接口中的抽象方法只能是public类型,并且默认即为public abstract类型
  • 抽象类中可以包含静态方法,接口中不能包含静态方法(JDK8之前)
上一篇:fragment不适用binding的加载视图方法


下一篇:抽象类