抽象类,实现(具体)类,接口的区别
抽象类、具体类和接口是面向对象编程中的三个基本构建块,它们各自有不同的用途和特点。
抽象类(Abstract Class)
- 定义: 抽象类不能被实例化,它通常用作基类,为其他子类提供一个通用的模板。
- 目的: 提供一个通用的框架,包含一些共同的方法和属性,可能包含抽象方法和具体方法。
- 实现: 可以包含部分实现的方法,也可以包含抽象方法。
- 继承: 子类通过继承抽象类来扩展其功能,必须实现所有的抽象方法。
- 使用场景: 当多个类共享通用的方法和属性时,可以使用抽象类作为基类。
具体类(Concrete Class)
- 定义: 具体类是可以被实例化的类。
- 目的: 提供完整的实现,用于创建对象。
- 实现: 包含所有方法的具体实现,没有抽象方法。
- 继承: 可以继承自抽象类或具体类,也可以不继承任何类。
- 使用场景: 当一个类不需要被其他类继承,或者它的实现细节已经足够具体,不需要进一步抽象时。
接口(Interface)
- 定义: 接口是一组抽象方法的集合,它不包含任何实现。
- 目的: 定义一个类必须遵循的契约或行为规范。
- 实现: 接口中的方法都是抽象的,不能包含实现(在Java 8之前)。
- 继承: 一个类可以实现多个接口,接口之间也可以相互继承。
- 使用场景: 当需要定义一个类的行为,但不关心其具体实现时,或者需要让不同的类保证有相同的方法签名时。
区别
-
实例化:
- 抽象类不能被实例化,但可以作为其他类的基类。
- 具体类可以被实例化。
-
抽象方法:
- 抽象类可以有抽象方法和具体方法。
- 接口只有抽象方法(Java 8之前)。从Java 8开始,接口可以有默认方法和静态方法。
-
实现:
- 抽象类提供了部分或全部方法的实现。
- 接口不提供方法实现(Java 8之前)。Java 8允许接口中有默认方法的实现。
-
继承:
- 抽象类可以被扩展(使用extends关键字)。
- 接口可以被实现(使用implements关键字)。
-
目的:
- 抽象类用于共享代码和创建一个模板。
- 接口用于定义能力或行为的契约。
-
多继承:
- Java中的类不能同时继承多个类,但可以实现多个接口。
-
访问修饰符:
- 抽象类中的成员可以有public、protected、private等访问修饰符。
- 接口中的成员默认是public的,Java 9开始可以显式地使用private修饰符。
-
构造方法:
- 抽象类可以有构造方法,但这些构造方法不能被外界直接调用。
- 接口不能有构造方法。
-
属性:
- 抽象类可以有属性和字段。
- 接口在Java 8之前不能有实例字段,只能有静态final常量。从Java 8开始,接口可以有默认方法和静态方法。
-
使用场景:
- 抽象类适用于存在公共行为的类层次结构。
- 接口适用于定义多个不相关类共有的协议或行为。