当前位置: 首页 > article >正文

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("鸟儿展翅飞翔");}
}
三、接口的特性与规则
  1. 多实现支持

    public class Helicopter implements Flyable, Movable {// 实现所有接口方法
    }
    
  2. 接口继承

    • 接口可继承多个接口(使用 extends 关键字)。
    public interface SuperFlyable extends Flyable, Attackable {// 扩展方法
    }
    
  3. 默认方法(Java 8+)

    • 提供默认实现,允许接口演化而不破坏现有实现类。
    • 子类可重写默认方法。
  4. 静态方法(Java 8+)

    • 接口的静态方法属于接口本身,通过 接口名.方法名() 调用。
四、接口的应用场景
  1. 定义规范

    • java.util.Comparator 接口,强制实现类定义比较逻辑。
    public class PersonComparator implements Comparator<Person> {@Overridepublic int compare(Person p1, Person p2) {return p1.getAge() - p2.getAge();}
    }
    
  2. 事件监听

    • java.awt.event.ActionListener 接口,处理按钮点击事件。
  3. 插件系统

    • 框架定义接口,第三方通过实现接口扩展功能(如Servlet规范)。
  4. 函数式接口(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+ 支持默认方法可包含普通方法和抽象方法
设计目的定义行为规范抽取公共状态和行为
六、注意事项
  1. 默认方法冲突

    • 若一个类实现多个包含相同默认方法的接口,必须显式重写该方法。
    public class MyClass implements InterfaceA, InterfaceB {@Overridepublic void commonMethod() {InterfaceA.super.commonMethod(); // 显式指定调用哪个接口的默认方法}
    }
    
  2. 接口中的私有方法(Java 9+)

    • 用于封装默认方法中的重复逻辑,外部不可访问。
    public interface MyInterface {default void publicMethod() {privateMethod(); // 调用私有方法}private void privateMethod() {// 实现细节}
    }
    
七、面试常见问题
  1. Java 8 为什么引入默认方法?

    • 为接口添加新方法时,避免破坏现有实现类(如 Collection 接口的 stream() 方法)。
  2. 接口可以包含构造方法吗?

    • 不可以,接口中不能有构造方法。
  3. 如何在接口中定义常量?

    • 直接声明 public static final 变量(可省略修饰符):
      int MAX_SIZE = 100; // 等价于 public static final int MAX_SIZE = 100;
      
八、最佳实践
  • 面向接口编程:依赖接口而非具体实现,提高代码灵活性。
  • 合理使用默认方法:仅在必要时添加默认方法,避免过度使用导致接口职责模糊。
  • 接口命名:使用形容词或动词短语(如 RunnableSerializable)。

通过接口,Java实现了对行为的抽象和多态的扩展,是构建高内聚、低耦合系统的关键工具。

http://www.lryc.cn/news/2393522.html

相关文章:

  • 【Java学习笔记】接口
  • 代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )
  • Wan2.1 图生视频模型内部协作流程
  • SI24R05国产低功耗2.4GHz+125K低频唤醒SoC人员定位/畜牧业牛羊定位/资产管理定位方案芯片
  • qt QAxWidget
  • 机器学习与深度学习04-逻辑回归02
  • CQF预备知识:Python相关库 -- NumPy 基础知识 - 通用函数
  • 基于ELK的分布式日志实时分析与可视化系统设计
  • @Async 注解 走的是主线程 还是子线程呢
  • 前端面经 React 组件常见的声明方式
  • 酒店管理系统设计与实现
  • OpenCV---pointPolygonTest
  • Qt 的简单示例 -- 地址簿
  • Linux 下 C 语言实现工厂模式
  • 什么是DevOps的核心目标?它如何解决传统开发与运维之间的冲突?​
  • RocketMQ 死信队列(DLQ)实战:原理 + 开发 + 运维 + 架构应用指南
  • Android studio 查看aar源码出现/* compiled code */
  • 用HTML5+JavaScript实现汉字转拼音工具
  • 基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计
  • ONNX模型的动态和静态量化
  • PHP 垃圾回收高级特性
  • OpenFeign vs MQ:微服务通信如何选型?详解同步与异步的适用场景
  • 如何用命令行将 PDF 表格转换为 HTML 表格
  • html5的响应式布局的方法示例详解
  • 如何用Python抓取Google Scholar
  • 电脑革命家测试版:硬件检测,6MB 轻量无广告 清理垃圾 + 禁用系统更新
  • Wireshark对usb设备进行抓包找不到USBPcap接口的解决方案
  • 题目 3298: 蓝桥杯2024年第十五届决赛真题-兔子集结
  • Unity开发之Webgl自动更新程序包
  • 深入理解设计模式之状态模式