【java基础】三、抽象类和接口

465 阅读4分钟

抽象类 

如果一个类中存在抽象方法(只有方法签名,没有方法实现),那么这个类必须被abstract修饰,这种类叫做抽象类,抽象类里可以没有抽象方法。 抽象类特点:

  1. 抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。
  2. 抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。即使抽象类不包含抽象方法,这个抽象类也不能创建实例。
  3. 抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要用于被其子类调用。
  4. 含有抽象方法的类(包括直接定义了一个抽象方法;或继承了一个抽象父类,但没有完全实现父类包含的抽象方法;或实现了一个接口,但没有完全实现接口包含的抽象方法三种情况)只能被定义成抽象类。

抽象类和普通类相比: 

  1. 抽象类可以包含抽象方法, 
  2. 抽象类不能用于创建实例。

抽象类体现的是一种模板模式的设计思想,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式。(子类可以实现抽象父类的某一个抽象方法,不需要全部实现抽象方法,此时子类必须被abstract修饰)

接口

接口定义的是多个类共同的公共行为规范,这些行为是与外部进行交流的通道,接口通常是定义一组公用方法(方法必须实现)。由于接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。

  1. 接口里可以包含成员变量(只能是静态常量)、方法(只能是抽象实例方法、类方法(static修饰的,通过类名.方法名调用)或 默认方法 default)、内部类(包括内部接口、枚举)定义。
  2. 接口里的所有成员都是public访问权限。
  3. 接口里定义的所有成员变量系统都默认使用public static final来修饰。
  4. 接口里的普通方法必须是抽象方法(隐式声明为public abstract),即没有方法实现;但类方法(static)、默认方法(default)必须要由实现。

接口和抽象类的差别 

接口作为系统与外界交互的窗口,接口体现的是一种规范。当在一个程序中使用接口时,接口是多个模块间的耦合标准;当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准。 

抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计。抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能(那些已经提供实现的方法),但这个产品不是最终产品,需要进一步的完善。

• 接口里只能包含抽象方法和默认方法和类方法,不能为普通方法提供实现;抽象类可以包含普通方法。
• 接口不能定义静态方法(java8之后可以(类方法);抽象类里可以定义静态方法。
• 接口里只能定义静态常量,不能定义普通成员变量;抽象类里则可以定义普通成员变量,也可以定义静态常量。
• 接口里不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类来调用这些构造器来完成属于抽象类的初始化操作。
• 接口里不能包含初始化块;但抽象类则完全可以包含初始化块。
• 一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。

什么时候使用抽象类和接口

• 如果想实现多重继承,那么必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。
• 如果基本功能在不断改变,那么就需要使用抽象类。如果使用接口,当功能改变时,所有实现了该接口的类都要重写
• 抽象类是is a关系,接口是has a关系