关于抽象类、抽象方法以及接口

谁都会走 提交于 2020-03-10 18:58:16

关于抽象类、抽象方法

abstract修饰

抽象类不能被实例化,抽象类里可以包含抽象方法也可以不包含;但有抽象方法的类必须是抽象类。

抽象类可以包含:

  • 成员变量
  • 方法(普通方法和抽象方法)
  • 构造器(不是用来构造对象的,主要是给子类调用)
  • 初始化块
  • 内部类(接口、枚举)

含有抽象方法的类,包括:

  • 直接定义了一个抽象方法;

  • 或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;

  • 或实现了一个接口,但没有完全实现接口包含的方法

只能定义为抽象类。

利用抽象方法和抽象类的优势,可以更好地发挥多态的优势,使得程序更加灵活;

abstract和final不能同时修饰同一个类或方法

当使用abstract修饰类时,表明这个类只能被继承;

当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写)。

而final修饰的类不能被继承,final修饰的方法不能被重写,因此final和abstract不能同时使用。

abstract和static不能修饰同一个方法,但它们可以同时修饰内部类。

abstract和private不能修饰同一个方法。

abstract不能修饰成员变量、局部变量,也不能修饰构造器。

使用模板模式的两种情形

  1. 抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给子类去实现。
  2. 父类中可能包含需要调用其他方法的方法,这些被调方法既可以由父类实现,也可以由子类实现。父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依靠于其子类的辅助。

关于接口

接口定义了一种规范——某一批类所需要遵守的规范。接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可满足实际需要。

可见,接口是从多个相似类中抽象出来的规范,接口不提供任何实现。接口体现的是规范和实现分离的设计思想,是一种松耦合的设计。

Java8中的接口定义

[修饰符] interface 接口名 extends 父接口1、父接口2...

{

0到n个常量定义...

0到n个抽象方法定义...

0到n个内部类、接口、枚举定义...

0到n个默认方法或类方法定义...

}

对上面语法的详细说明如下

  1. 修饰符可以是public或省略,如果是省略,则默认采用包权限访问控制符,只有相同包下的才可以访问该接口。
  2. 接口名应与类名采用相同的命名规则,即如果仅从语法角度来看,接口名只要是合法的标识符即可。
  3. 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。

由于接口定义的只是一种规范,因此接口里不能包含构造器和初始化块定义。

接口里可以包含成员变量(只能静态常量)、方法(只能是抽象实例方法,类方法,默认方法)、内部类(包括内部接口、枚举)定义。

由于接口里定义的是多个类共同的公共行为规范,因此接口里的所有成员,包括常量、方法、内部类和内部枚举都是public访问权限,定义接口成员时,可以省略访问控制符,如果指定访问控制符,则只能是public。

对于接口里定义的静态常量而言,它们是接口相关的,因此系统会自动为这些成员变量增加static和final两个修饰符。

也就是说,在接口中定义成员变量时,不管是否使用public static final修饰符,接口里的成员变量总是使用这三个来修饰。而且接口里没有构造器和初始化块,因此接口里定义的成员变量只能在定义时指定默认值。

对于接口里定义的方法而言,如果不是定义默认方法(default)或类方法(static),系统将自动为普通方法增加abstract修饰符。

接口里的普通方法不能有方法体;但类方法、默认方法必须有方法实现。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!