抽象类
- 抽象类可以不含有抽象方法,含有抽象方法的一定是抽象类或者接口。
- 抽象类(的构造器)不能用于创建实例,只能被当作父类被其他子类继承,如果子类是普通类,则必须实现所有抽象方法。
- final修饰的类不能被继承,因此abstract和final不能同时出现。
- 使用static修饰方法时,通过类就可以调用该方法,但是如果被定义成抽象方法,则调用时会出现错误,因此static和final不能同时修饰方法,但是他们可以同时修饰内部类。
- abstract方法必须被子类重写才有意义,因此,abstract方法不能定义为private。
- 抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象,以抽象类作为子类的模板,从而避免了子类设计的随意性。
模板模式及其简单规则:
模板模式:编写一个抽象父类,父类提供多个子类的通用方法,并把一个或多个方法留给其子类实现。
简单规则:
- 抽象父类可以制定一需要使用的某些方法,把不能实现的部分抽象成抽象方法,留给其子类去实现。
- 父类可能含有需要调用其他系列方法的方法,这些被调方法既可以由父类实现,也可以由其子类实现。父类里提供的方法
只是定义类一个通用算法,其实现也许不完全由自身实现,而必须依赖其子类的辅助。
接口
- 一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。
- 接口定义的是一种规范,接口里不能包含构造器和初始化块定义,接口里的成员变量只能是静态变量,方法只能是抽象方法、类方法或默认方法。
- Java 8允许在接口中定义默认方法,默认方法必须使用default修饰,该方法不能使用static修饰,无论程序是否指定,默认方法总是使用public修饰。接口里的成员变量默认使用public static final修饰。
接口和抽象类用法上的区别:
- 接口体现的是一种规范,一种标准。而抽象类作为多个子类的共同父类,体现的是一种模板式设计。
- 接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供实现;抽象类则完全可以包含普通方法。
- 接口里只能定义静态常量,不能定义普通成员变量;抽象类两者都可以。
- 接口里不含构造器,而抽象类里可以含有构造器(不用来创建对象,让其子类调用来完成属于抽象类的初始化操作)。
- 接口里不包含初始化块,抽象类可以。
- 一个类最多只能由一个直接父类(包括抽象类);但一个类可以直接实现多个接口,来弥足Java单继承的不足。