一、抽象类
- 抽象类和抽象方法都必须用abstract修饰符来定义,抽象方法不能有方法体。
- 抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器来创建抽象类的实例。即使这个抽象类不含抽象方法,这个抽象类也不能被实例化。
- 抽象类可以含有成员变量,方法(普通方法和抽象方法都可以),构造器,初始代码块,内部类(接口,枚举)五种。抽象类的构造器不能被用于创建实例,主要用于被其子类调用。
- 含有抽象方法的类(包括直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现抽象父类的所有抽象方法;或者实现了一个接口,但是没有完全实现这个接口所包含的抽象方法)就一定是抽象类。
- abstract不能用来修饰成员变量,不能用来修饰局部变量,不能用来修饰构造器,即没有抽象方法、抽象变量,抽象构造器等说法。抽象类定义的构造器只能是普通构造器。
- abstract和static修饰符不能同时修饰某个方法,因为abstract修饰的方法没有方法体,而static修饰的方法属于类方法,随着类的加载而被创建,即调用了一个没有方法体的类方法肯定会引起错误。
1.1使用抽象类
二、接口类
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更加彻底,且可以提升出更加”抽象的类“——接口。接口中不能含有普通方法(Java8之后接口中含有deafult方法,可以含有方法体)。
- 一个接口可以继承多个接口,被类实现,但是不能继承类。
- 接口定义的是一种规范,因此接口里不能含有构造器和初始化代码块。接口中可以包含成员变量(只能是静态常量),方法(只能是抽象实例方法、类方法或默认方法)
- 接口中定义的是多个类共同的公共行为规范,因此接口中的所有成员都是(包括常量、方法、内部类、和内部枚举)public访问权限。
- 对于接口中定义的静态常量而言,它们是接口相关的,因此系统会自动为这些成员变量加上final和static修饰符。系统会默认为接口中的成员变量使用
public static final
修饰符。(由于接口中没有代码块和构造器,所以接口中的变量只能在定义的时候指定默认值)。 - 接口中定义的普通方法无论是否加了
public abstract
修饰符,系统都会默认为其加上public abstract
修饰。