interface
关键字定义接口(声明抽象方法),再通过implements
关键字在类中实现接口方法,接口支持多继承,强制实现类遵守契约,增强代码规范性与扩展性。接口的核心作用
- 定义规范:约定类必须实现的方法(契约式编程)。
- 实现多继承:类可同时实现多个接口。
- 解耦代码:分离声明与实现,提升扩展性。
添加接口的步骤
声明接口
使用 interface
关键字定义接口,包含抽象方法(隐式 public abstract
):
// 定义接口 public interface Vehicle { void start(); // 抽象方法(无方法体) void stop(); // Java 8+ 支持默认方法 default void honk() { System.out.println("Beep beep!"); } // Java 8+ 支持静态方法 static int getMaxSpeed() { return 200; } }
实现接口
类通过 implements
关键字实现接口,必须重写所有抽象方法:
public class Car implements Vehicle { @Override public void start() { System.out.println("Car engine started"); } @Override public void stop() { System.out.println("Car engine stopped"); } }
多接口实现
一个类可实现多个接口(用逗号分隔):
public class Drone implements Vehicle, Camera { @Override public void start() { /* 实现Vehicle的方法 */ } @Override public void stop() { /* 实现Vehicle的方法 */ } @Override public void takePhoto() { /* 实现Camera的方法 */ } }
接口继承
接口可继承其他接口(支持多继承):
public interface ElectricVehicle extends Vehicle, Chargable { void batteryCapacity(); }
接口特性详解
-
默认方法(Java 8+)
- 用
default
修饰,提供默认实现。 - 实现类可直接使用或重写。
interface Speaker { default void playSound() { System.out.println("Playing default sound"); } }
- 用
-
静态方法(Java 8+)
- 通过接口名直接调用,不依赖实例。
Vehicle.getMaxSpeed(); // 调用静态方法
- 通过接口名直接调用,不依赖实例。
-
常量字段
- 接口中声明的变量默认为
public static final
。interface Constants { double PI = 3.14; // 等同于 public static final double PI }
- 接口中声明的变量默认为
接口 vs 抽象类
特性 | 接口 | 抽象类 |
---|---|---|
方法实现 | 支持默认方法(Java 8+) | 支持抽象/具体方法 |
多继承 | 类可实现多个接口 | 类只能继承一个抽象类 |
构造函数 | 不允许 | 允许 |
状态(字段) | 只允许常量 | 可包含实例变量 |
适用场景 | 定义行为契约 | 复用代码或共享状态 |
最佳实践
-
面向接口编程
// 声明接口类型变量 Vehicle myVehicle = new Car(); myVehicle.start(); // 运行时绑定到Car的实现
-
接口隔离原则
拆分臃肿接口为多个小接口,避免强制实现无关方法。 -
优先使用默认方法
在接口升级时添加默认方法,避免破坏现有实现类。
完整示例
// 定义接口 interface Logger { void log(String message); default void logError(String error) { log("[ERROR] " + error); } } // 实现接口 class FileLogger implements Logger { @Override public void log(String message) { System.out.println("Writing to file: " + message); } } // 使用接口 public class Main { public static void main(String[] args) { Logger logger = new FileLogger(); logger.log("System started"); // 输出: Writing to file: System started logger.logError("Disk full"); // 输出: Writing to file: [ERROR] Disk full } }
常见问题
Q1: 接口能包含构造方法吗?
不能,接口没有构造方法,无法实例化。
Q2: 接口方法可以是 private
吗?
- Java 9+ 支持
private
方法(用于拆分默认方法逻辑)。 - 抽象方法必须是
public
(可省略修饰符)。
Q3: 何时用接口?何时用抽象类?
- 需要多继承或定义行为规范 → 接口。
- 需要共享代码或维护状态 → 抽象类。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/24172.html