JavaSE:面向对象进阶之接口(Interface)

news2025/6/2 9:25:08

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 {
    @Override
    public 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> {
        @Override
        public 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 {
        @Override
        public 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.coloradmin.cn/o/2393522.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java学习笔记】接口

接口 应用场景引出 一、接口的介绍 1. 接口的基本结构 interface 接口名{属性抽象方法 }引出关键字&#xff1a;implements 2. 子类实现接口 class a implements 接口名{}3. 接口中的属性说明&#xff1a;属性默认是public static final修饰的 &#xff08;1&#xff09;f…

代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )

图论part08 拓扑排序精讲 代码随想录讲解链接 题目链接 思路 在这个题目之中&#xff0c;个别文件的处理依赖于别的文件&#xff0c;因此&#xff0c;文件的处理顺序十分重要。我们用图来表示文件的处理顺序&#xff0c;文件s指向文件t&#xff0c;则说明如果要正确的处理文…

SI24R05国产低功耗2.4GHz+125K低频唤醒SoC人员定位/畜牧业牛羊定位/资产管理定位方案芯片

目录 SI24R05简介功能框图 主要特性开发工具方案特性 SI24R05简介 Si24R05 是一款高度集成的低功耗 SOC 芯片&#xff0c;具有低功耗、Low Pin Count、 宽电压工作范围&#xff0c;集成了 13/14/15/16 位精度的 ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、无线收发器、…

基于ELK的分布式日志实时分析与可视化系统设计

目录 一、ELK平台介绍 1.ELK概述 2.Elasticsearch 3.Logstash 4.Kibana 二、部署ES群集 1.资源清单 2.基本配置 3.安装Elasticsearch&#xff08;elk1上、elk2上、elk3上&#xff09; 4.安装logstash&#xff08;elk1上&#xff09; 5.Filebeat 6.安装Kibana&#x…

酒店管理系统设计与实现

本科毕业设计(论文) 设计(论文)题目 酒店管理系统设计与实现 学生姓名 学生学号 所在学院 专业班级 校内指导教师 李建 企业指导教师 毕业设计(论文)真实性承诺及声明 学生对毕业设计(论文)真实性承诺 本人郑重声明:所提交的毕业设计(论文)作品是本人在指导教师的指…

OpenCV---pointPolygonTest

一、基本概念与用途 pointPolygonTest 是 OpenCV 中用于判断点与多边形关系的重要函数&#xff0c;常用于&#xff1a; 目标检测&#xff1a;判断像素点是否属于检测到的轮廓区域碰撞检测&#xff1a;检测物体是否重叠图像分割&#xff1a;确定点是否在分割区域内几何分析&am…

Qt 的简单示例 -- 地址簿

这个工程里有两个窗口&#xff0c;都是QWidget派生的窗口 主窗口&#xff1a; 1. 运用了布局&#xff0c;按钮控件&#xff0c;单行编辑框&#xff0c;富文本编辑框等窗口部件&#xff1b; 2. 运用了 QMap 类&#xff1b; 3. 实现了点击按钮弹出子窗口的功能&#xff0c;这里子…

什么是DevOps的核心目标?它如何解决传统开发与运维之间的冲突?​

在当今数字化转型加速的时代&#xff0c;DevOps 已成为软件开发领域备受瞩目的明星理念。今天&#xff0c;本文将聚焦于 DevOps 的核心目标&#xff0c;并深入探讨它如何巧妙化解传统开发与运维之间的冲突&#xff0c;为大家揭开 DevOps 的神秘面纱并分享实用经验。本次介绍的与…

Android studio 查看aar源码出现/* compiled code */

如图查看aar源码时看不到具体实现&#xff0c;在排除是sdk版本导致的问题后&#xff0c;下面说解决方法 打开设置&#xff0c;找到插件 输入decompiler 搜索 这个是自带的反编译工具&#xff0c;启用就好了

用HTML5+JavaScript实现汉字转拼音工具

用HTML5JavaScript实现汉字转拼音工具 前一篇博文&#xff08;https://blog.csdn.net/cnds123/article/details/148067680&#xff09;提到&#xff0c;当需要将拼音添加到汉字上面时&#xff0c;用python实现比HTML5JavaScript实现繁琐。在这篇博文中用HTML5JavaScript实现汉…

基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计

摘要 随着医疗信息化的不断推进以及“互联网医疗”模式的广泛普及&#xff0c;传统医院挂号流程中存在的排队时间长、资源分配不均等问题日益凸显&#xff0c;急需通过数字化手段加以解决。本研究设计并实现了一套基于Java、SpringBoot、Vue与UniAPP技术栈的医院预约挂号微信小…

ONNX模型的动态和静态量化

引言  通常我们将模型转换为onnx格式之后&#xff0c;模型的体积可能比较大&#xff0c;这样在某些场景下就无法适用。最近想在移动端部署语音识别、合成模型&#xff0c;但是目前的效果较好的模型动辄几个G&#xff0c;于是便想着将模型压缩一下。本文探索了两种压缩方法&…

如何用Python抓取Google Scholar

文章目录 [TOC](文章目录) 前言一、为什么要抓取Google Scholar&#xff1f;二、Google Scholar 抓取需要什么三、为什么代理对于稳定的抓取是必要的四、一步一步谷歌学者抓取教程4.1. 分页和循环4.2. 运行脚本 五、完整的Google Scholar抓取代码六、抓取Google Scholar的高级提…

Wireshark对usb设备进行抓包找不到USBPcap接口的解决方案

引言 近日工作需要针对usb设备进行抓包&#xff0c;但按照wireshark安装程序流程一步步走&#xff0c;即使勾选了安装USBPcap安装完成后开启wireshark依然不显示USBPcap接口&#xff0c;随设法进行解决。 最终能够正常显示USBPcap接口并能够正常使用进行抓包 解决方案&#x…

Socket 编程 UDP

目录 1. UDP网络编程 1.1 echo server 1.1.1 接口 1.1.1.1 创建套接字 1.1.1.2 绑定 1.1.1.3 bzero 1.1.1.4 htons&#xff08;主机序列转网络序列&#xff09; 1.1.1.5 inet_addr&#xff08;主机序列IP转网络序列IP&#xff09; 1.1.1.6 recvfrom&#xff08;让服务…

Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本

Jenkins实践(8):服务器A通过SSH调用服务器B执行Python自动化脚本 1、需求: 1、Jenkins服务器在74上,Python脚本在196服务器上 2、需要在服务器74的Jenkins上调用196上的脚本执行Python自动化测试 2、操作步骤 第一步:Linux Centos7配置SSH免密登录 Linux Centos7配置S…

lua的注意事项2

总之&#xff0c;下面的返回值不是10&#xff0c;a&#xff0c;b 而且

前端八股之HTML

前端秘籍-HTML篇 1. src和href的区别 src 用于替换当前元素&#xff0c;href 用于在当前文档和引用资源之间确立联系。 &#xff08;1&#xff09;src src 是 source 的缩写&#xff0c;指向外部资源的位置&#xff0c;指向的内容将会嵌入到文档中当前标签所在位置&#xff1…

鲲鹏Arm+麒麟V10,国产化信创 K8s 离线部署保姆级教程

Rainbond V6 国产化部署教程&#xff0c;针对鲲鹏 CPU 麒麟 V10 的离线环境&#xff0c;手把手教你从环境准备到应用上线&#xff0c;所有依赖包提前打包好&#xff0c;步骤写成傻瓜式操作指南。别说技术团队了&#xff0c;照着文档一步步来&#xff0c;让你领导来都能独立完成…

【C++ Qt】认识Qt、Qt 项目搭建流程(图文并茂、通俗易懂)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本章将开启Qt的学习&#xff0c;Qt是一个较为古老但仍然在GUI图形化界面设计中有着举足轻重的地位&#xff0c;因为它适合嵌入式和多种平台而被广泛使用…