Java 接口与抽象函数
1. 接口(Interface)
1.1 接口的定义与声明
接口是 Java 中一种完全抽象的类,用于定义一组方法规范,但不提供具体实现。接口通过interface关键字声明。同时接口也是一种方法,不能继承(不能有子类)。
// 定义一个接口publicinterfaceAnimal{// 接口中的方法默认是 public abstract (抽象函数)的voideat();voidsleep();voidbreathe(){System.out.println("动物在呼吸");}voidshowInfo(){System.out.println("这是一个动物接口");}}1.2 接口的特点
- 完全抽象:接口中的方法默认都是
public abstract的 - 类与接口不能继承(extends),只能实现
- 多实现:一个类可以实现多个接口
- 常量定义:接口中的变量默认是
public static final的 - 无构造方法:接口不能有构造方法
- 接口不能实例化,只能对实现接口的子类进行实例化
- 静态方法:可以直接通过接口名调用
1.3 接口的实现
类使用implements关键字实现接口,必须实现接口中的所有抽象方法(除非是抽象类)。
// 实现接口publicclassDogimplementsAnimal{@Override//重写publicvoideat(){System.out.println("狗在吃狗粮");}@Overridepublicvoidsleep(){System.out.println("狗在睡觉");}}// 多接口实现publicclassSmartDogimplementsAnimal,Pet{// 必须实现两个接口的所有抽象方法}2. 抽象函数与抽象类
2.1 抽象函数(Abstract Method)
抽象函数是只有声明没有实现的方法,使用abstract关键字修饰。
// 抽象函数示例publicabstractvoidmakeSound();2.2 抽象类(Abstract Class)
抽象类是包含抽象方法的类,使用abstract关键字声明。抽象类不能被实例化。
// 定义一个抽象类publicabstractclassVehicle{// 抽象方法publicabstractvoidstart();publicabstractvoidstop();// 具体方法publicvoidhonk(){System.out.println("车辆鸣笛");}// 构造方法(抽象类可以有构造方法)publicVehicle(Stringbrand){this.brand=brand;}privateStringbrand;}2.3 抽象类的继承
子类继承抽象类时,必须实现父类中的所有抽象方法(除非子类也是抽象类)。
// 继承抽象类publicclassCarextendsVehicle{publicCar(Stringbrand){super(brand);}@Overridepublicvoidstart(){System.out.println("汽车启动");}@Overridepublicvoidstop(){System.out.println("汽车停止");}}3. 接口 vs 抽象类
3.1 主要区别
| 特性 | 接口 | 抽象类 |
|---|---|---|
| 关键字 | interface | abstract class |
| 方法实现 | 默认无实现 | 可以有具体方法 |
| 变量 | 只能是常量 | 可以有普通变量 |
| 构造方法 | 不能有 | 可以有 |
| 继承 | 多继承(实现多个接口) | 单继承 |
| 访问修饰符 | 默认 public | 可以是任意 |
| 设计目的 | 定义行为规范 | 提供部分实现 |
3.2 使用场景
使用接口的场景:
- 需要定义一组行为规范
- 需要实现多重继承
- 需要定义回调机制
- 需要实现松耦合设计
使用抽象类的场景:
- 多个类有共同的代码逻辑
- 需要控制子类的访问权限
- 需要定义非静态、非 final 的字段
- 需要提供构造方法
4. 总结
接口和抽象函数是 Java 面向对象编程的重要概念。接口主要用于定义行为规范,支持多继承;抽象类用于提供部分实现,支持代码复用。在实际开发中,应根据具体需求选择合适的方式,通常优先考虑接口以实现松耦合设计。Java 8 引入的默认方法、静态方法和函数式接口进一步增强了接口的能力,使代码更加灵活和简洁。