抽象类
定义:
抽象类是一种不能直接实例化的类,它可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。抽象类的主要目的是被其他类继承,从而提供一个通用的基类。
特点:
- 不能实例化:你不能创建抽象类的对象,只能通过继承它的子类来使用。
- 可以包含具体方法:抽象类可以包含具体的方法,这些方法在子类中可以直接使用,或者被重写。
- 可以有构造方法:虽然你不能实例化抽象类,但它可以有构造方法,供子类调用。
- 关键词:使用
abstract
关键字来定义抽象类和抽象方法。 - 单继承:一个类只能继承一个抽象类。
举例说明:
想象一下,你有一个抽象的“动物”类,这个类有一个抽象方法“发出声音”,不同的动物会有不同的实现。此外,这个类还可以有一个具体方法“吃”,所有动物都可以直接使用这个方法。
接口
定义:
接口是一种特殊的类,它只能包含方法的声明(没有方法的具体实现)和常量。接口定义了类必须实现的方法,但不提供具体的实现。类通过实现接口来承诺实现这些方法。
特点:
- 不能包含具体方法(Java 8以前):接口中的方法在Java 8以前都是抽象的,不能有方法的具体实现。Java 8以后,接口可以包含默认方法(有具体实现)和静态方法。
- 多实现:一个类可以实现多个接口,这弥补了Java单继承的限制。
- 没有构造方法:接口不能有构造方法,因为你不能实例化接口。
- 关键词:使用
interface
关键字来定义接口,使用implements
关键字来实现接口。
举例说明:
想象一下,你有一个“飞行”接口,这个接口有一个方法“飞”。任何实现这个接口的类,比如“鸟”、“飞机”,都必须提供“飞”这个方法的具体实现。
主要区别
-
实例化:
- 抽象类不能实例化,只能被继承。
- 接口也不能实例化,但可以被多个类实现。
-
方法实现:
- 抽象类可以包含具体方法和抽象方法。
- 接口在Java 8以前只能包含抽象方法,Java 8以后可以包含默认方法和静态方法。
-
多继承:
- 一个类只能继承一个抽象类。
- 一个类可以实现多个接口。
-
构造方法:
- 抽象类可以有构造方法。
- 接口不能有构造方法。
选择使用:
- 抽象类:当你有一些通用的代码需要在多个相关类中共享,并且这些类具有“is-a”的关系时,使用抽象类。
- 接口:当你需要定义一组方法,但不同的类可以有不同的实现时,使用接口。特别是当你需要实现多继承时,接口是唯一的选择。