JavaSE:面向对象进阶之接口(Interface)
JavaSE 面向对象进阶之接口(Interface)
一、接口的核心概念
接口是一种完全抽象的类型,它定义了一组方法签名(契约),但不包含方法实现。接口的核心作用是:
- 规范行为:强制实现类遵循统一的方法定义。
- 支持多实现:一个类可同时实现多个接口,突破单继承限制。
- 解耦设计:分离定义与实现,便于代码扩展和维护。
二、接口的语法与特性
- 声明接口:使用
interface
关键字。 - 接口方法:默认是
public abstract
,无需显式声明。 - 接口常量:默认是
public static final
,必须显式初始化。 - 示例:
// 接口:Flyable
public interface Flyable {// 接口常量(必须赋值)int MAX_SPEED = 1000;// 抽象方法(默认public abstract)void fly();// Java 8+ 默认方法(需提供实现)default void land() {System.out.println("准备降落");}// Java 8+ 静态方法static void checkWeather() {System.out.println("检查天气状况");}
}
- 实现接口:
public class Bird implements Flyable {@Overridepublic void fly() {System.out.println("鸟儿展翅飞翔");}
}
三、接口的特性与规则
-
多实现支持:
public class Helicopter implements Flyable, Movable {// 实现所有接口方法 }
-
接口继承:
- 接口可继承多个接口(使用
extends
关键字)。
public interface SuperFlyable extends Flyable, Attackable {// 扩展方法 }
- 接口可继承多个接口(使用
-
默认方法(Java 8+):
- 提供默认实现,允许接口演化而不破坏现有实现类。
- 子类可重写默认方法。
-
静态方法(Java 8+):
- 接口的静态方法属于接口本身,通过
接口名.方法名()
调用。
- 接口的静态方法属于接口本身,通过
四、接口的应用场景
-
定义规范:
- 如
java.util.Comparator
接口,强制实现类定义比较逻辑。
public class PersonComparator implements Comparator<Person> {@Overridepublic int compare(Person p1, Person p2) {return p1.getAge() - p2.getAge();} }
- 如
-
事件监听:
- 如
java.awt.event.ActionListener
接口,处理按钮点击事件。
- 如
-
插件系统:
- 框架定义接口,第三方通过实现接口扩展功能(如Servlet规范)。
-
函数式接口(Java 8+):
- 仅含一个抽象方法的接口,可使用Lambda表达式简化实现。
@FunctionalInterface public interface Calculator {int calculate(int a, int b); }// Lambda实现 Calculator add = (a, b) -> a + b;
五、接口与抽象类的对比
特性 | 接口 | 抽象类 |
---|---|---|
实例化 | ❌ | ❌ |
继承/实现方式 | 类使用 implements ,可多实现 | 类使用 extends ,单继承 |
成员变量 | 只能是 public static final | 无限制 |
方法实现 | 默认抽象,Java 8+ 支持默认方法 | 可包含普通方法和抽象方法 |
设计目的 | 定义行为规范 | 抽取公共状态和行为 |
六、注意事项
-
默认方法冲突:
- 若一个类实现多个包含相同默认方法的接口,必须显式重写该方法。
public class MyClass implements InterfaceA, InterfaceB {@Overridepublic void commonMethod() {InterfaceA.super.commonMethod(); // 显式指定调用哪个接口的默认方法} }
-
接口中的私有方法(Java 9+):
- 用于封装默认方法中的重复逻辑,外部不可访问。
public interface MyInterface {default void publicMethod() {privateMethod(); // 调用私有方法}private void privateMethod() {// 实现细节} }
七、面试常见问题
-
Java 8 为什么引入默认方法?
- 为接口添加新方法时,避免破坏现有实现类(如
Collection
接口的stream()
方法)。
- 为接口添加新方法时,避免破坏现有实现类(如
-
接口可以包含构造方法吗?
- 不可以,接口中不能有构造方法。
-
如何在接口中定义常量?
- 直接声明
public static final
变量(可省略修饰符):int MAX_SIZE = 100; // 等价于 public static final int MAX_SIZE = 100;
- 直接声明
八、最佳实践
- 面向接口编程:依赖接口而非具体实现,提高代码灵活性。
- 合理使用默认方法:仅在必要时添加默认方法,避免过度使用导致接口职责模糊。
- 接口命名:使用形容词或动词短语(如
Runnable
、Serializable
)。
通过接口,Java实现了对行为的抽象和多态的扩展,是构建高内聚、低耦合系统的关键工具。