关于抽象类、抽象方法
abstract修饰
抽象类不能被实例化,抽象类里可以包含抽象方法也可以不包含;但有抽象方法的类必须是抽象类。
抽象类可以包含:
- 成员变量
- 方法(普通方法和抽象方法)
- 构造器(不是用来构造对象的,主要是给子类调用)
- 初始化块
- 内部类(接口、枚举)
含有抽象方法的类,包括:
直接定义了一个抽象方法;
或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;
或实现了一个接口,但没有完全实现接口包含的方法
只能定义为抽象类。
利用抽象方法和抽象类的优势,可以更好地发挥多态的优势,使得程序更加灵活;
abstract和final不能同时修饰同一个类或方法
当使用abstract修饰类时,表明这个类只能被继承;
当使用abstract修饰方法时,表明这个方法必须由子类提供实现(即重写)。
而final修饰的类不能被继承,final修饰的方法不能被重写,因此final和abstract不能同时使用。
abstract和static不能修饰同一个方法,但它们可以同时修饰内部类。
abstract和private不能修饰同一个方法。
abstract不能修饰成员变量、局部变量,也不能修饰构造器。
使用模板模式的两种情形
- 抽象父类可以只定义需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给子类去实现。
- 父类中可能包含需要调用其他方法的方法,这些被调方法既可以由父类实现,也可以由子类实现。父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依靠于其子类的辅助。
关于接口
接口定义了一种规范——某一批类所需要遵守的规范。接口不关心这些类的内部状态数据,也不关心这些类里方法的实现细节,它只规定这批类里必须提供某些方法,提供这些方法的类就可满足实际需要。
可见,接口是从多个相似类中抽象出来的规范,接口不提供任何实现。接口体现的是规范和实现分离的设计思想,是一种松耦合的设计。
Java8中的接口定义
[修饰符] interface 接口名 extends 父接口1、父接口2...
{
0到n个常量定义...
0到n个抽象方法定义...
0到n个内部类、接口、枚举定义...
0到n个默认方法或类方法定义...
}
对上面语法的详细说明如下
- 修饰符可以是public或省略,如果是省略,则默认采用包权限访问控制符,只有相同包下的才可以访问该接口。
- 接口名应与类名采用相同的命名规则,即如果仅从语法角度来看,接口名只要是合法的标识符即可。
- 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。
由于接口定义的只是一种规范,因此接口里不能包含构造器和初始化块定义。
接口里可以包含成员变量(只能静态常量)、方法(只能是抽象实例方法,类方法,默认方法)、内部类(包括内部接口、枚举)定义。
由于接口里定义的是多个类共同的公共行为规范,因此接口里的所有成员,包括常量、方法、内部类和内部枚举都是public访问权限,定义接口成员时,可以省略访问控制符,如果指定访问控制符,则只能是public。
对于接口里定义的静态常量而言,它们是接口相关的,因此系统会自动为这些成员变量增加static和final两个修饰符。
也就是说,在接口中定义成员变量时,不管是否使用public static final修饰符,接口里的成员变量总是使用这三个来修饰。而且接口里没有构造器和初始化块,因此接口里定义的成员变量只能在定义时指定默认值。
对于接口里定义的方法而言,如果不是定义默认方法(default)或类方法(static),系统将自动为普通方法增加abstract修饰符。
接口里的普通方法不能有方法体;但类方法、默认方法必须有方法实现。
来源:https://www.cnblogs.com/woshi123/p/12457843.html