news 2026/5/4 7:32:26

Java 抽象类与接口核心知识点完全解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 抽象类与接口核心知识点完全解析

声明定义抽象类

publicabstractclassCRMSystem{publicabstractClientadd(ClientnewGuy);//添加用户方法publicabstractEventadd(Evente,Clientguy);//重载添加事件、用户方法publicabstractEvent[]todayEvents();//今日事件方法}

说明:

  1. 抽象类有构造器,其访问权限可以声明为publicprotecteddefault。构造器的作用是在子类实例化时,通过子类的super(...)被调用,用于初始化父类内部的属性。抽象类的构造器不能被直接用于new实例化,子类的普通方法也不能调用父类构造器。
  2. 接口和抽象类都不能直接实例化(不能new)。
  3. 抽象方法所在的类必须是抽象类(从设计意图上讲,接口可以视为一种纯抽象类)。
  4. 抽象类可以只有抽象方法,没有具体方法。
  5. 抽象类可以只有具体方法,没有抽象方法。这样设计的唯一目的就是:阻止该类被实例化(例如工具类Collections)。
  6. 抽象类的类体内容可以为空。
  7. 抽象类中的抽象方法的访问权限修饰符可以是publicprotecteddefault,但是不可以是private。若没有指明访问权限修饰符,默认是default
  8. 抽象类中可以声明任意类型的变量(不论是静态的还是非静态的,final的还是非final的,公开的还是私有的)。
  9. 当一个抽象类实现一个接口时,如果它没有实现接口中的某些抽象方法,那么这些抽象方法会被保留在该抽象类中,作为该抽象类自身的抽象方法,等待其具体的子类去实现。(注意:这里用词是“保留”,而不是“继承”,因为类与接口之间是实现关系)。
  10. abstract不能与final同时修饰同一个类(final阻止继承,abstract强制要求继承,二者矛盾)。
  11. abstract不能与privatestaticfinalnative同时修饰同一个方法。
  12. 在抽象类中声明一个与父接口方法签名完全相同的抽象方法,这在概念上称为**“实现”**了接口方法(但未提供实现体)。这属于实现关系,不叫“覆盖重写”,因为接口的抽象方法根本没有方法体可供“覆盖”。
    应用场景:
    抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。如果某个方法在父类中实现并没有任何意义,而是根据子类的实际需求来进行不同的实现,那么就可以将这个方法在父类中声明为abstract方法,那么这个父类也就成为abstract类了。

声明定义接口

publicinterfaceCRMSystem{Clientadd(ClientnewGuy);Eventadd(Evente,Clientguy);Event[]todayEvents();// 默认方法,用来升级接口publicdefaultvoidmyMethodDefault(){// ...}}

说明:

  1. 接口中声明定义的变量,默认且必须是public static final,其实就是全局静态常量,所以必须在声明时初始化(即赋值)。
  2. 接口中定义的常量
  • 子接口(extends)可以访问父接口的常量,并且可以直接通过子接口名引用(例如 ChildInterface.CONSTANT)。但常量在内存中仍然只属于声明它们的父接口,子接口并不“拥有”自己的副本(反射 子接口.class.getDeclaredFields() 不会包含该常量)。

  • 实现类(implements)也可以访问接口常量(通过接口名或直接使用常量名),但同样不拥有这些常量。

  • 日常交流中有时会说“子接口继承了常量”,这是语法层面的通俗说法,严格意义上应说“子接口可以访问父接口的常量”。

  1. 接口中声明的抽象方法默认是public abstract的(可以省略不写),并且不可以是final,也不可以是static

  2. 如果是 Java 8,还可以额外包含默认方法和静态方法:

    • 默认方法:会被实现子类继承(具体子类可以直接使用,也可以重写它)。
    • 静态方法不会被实现子类继承。接口的静态方法属于接口本身,只能通过“接口名.静态方法”调用,实现类无法访问。
    publicdefault返回值类型 方法名(参数列表){方法体}// 默认方法,只能是public,不可加static/finalpublicstatic返回值类型 方法名(参数列表){方法体}// 静态方法,只能是public 或 private,不可加final
  3. 如果是 Java 9,还可以包含私有方法(纯粹用于接口内部的代码复用):

    private返回值类型 方法名(参数列表){方法体}// 私有的普通方法privatestatic返回值类型 方法名(参数列表){方法体}// 私有的静态方法

    (注:私有方法绝对不被子类继承,也不存在于子类对象的内存中,它们仅存在于接口定义的 bytecode 中,供接口自身的 default/static 方法内部调用。)

  4. 不能通过实现子类的对象名称或类名去调用接口的静态方法(会直接编译报错)。静态方法只能通过接口名调用。

  5. 接口不可以有静态代码块和构造器。

  6. 接口体的内容可以为空(这被称为标记接口,如Serializable)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 1:43:20

为什么你的多模态告警总在故障后才触发?深度拆解3类时序错配陷阱(含跨模态延迟补偿算法与滑动窗口动态阈值公式)

第一章:多模态大模型监控告警体系 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在推理服务、训练任务与数据流水线中表现出高度动态性,其性能退化、模态失配、显存泄漏或跨模态对齐偏差往往难以通过单一指标捕获。构建覆盖输入-处理-输出…

作者头像 李华
网站建设 2026/4/16 1:40:17

Cursor,底层到底是怎么理解你代码上下文的? (2)

Cursor,底层到底是怎么理解你代码上下文的? 我刚开始用的时候也觉得很神奇。以前用 ESLint 或者正则匹配,总是会误报或者漏报,但 Cursor 就像是真的有一个资深同事在旁边看着你写代码一样。 后来我专门去翻了翻它的底层逻辑和相关…

作者头像 李华
网站建设 2026/4/16 1:40:13

Xtreme Download Manager:5倍下载加速与视频下载的终极解决方案

Xtreme Download Manager:5倍下载加速与视频下载的终极解决方案 【免费下载链接】xdm Powerfull download accelerator and video downloader 项目地址: https://gitcode.com/gh_mirrors/xd/xdm 当你面对缓慢的下载速度、频繁中断的网络连接,或是…

作者头像 李华
网站建设 2026/4/16 1:35:12

小程序如何降低获客成本?

小程序如何降低获客成本?小程序降低获客成本的关键,不在于减少投入,而在于:让每一次获客都可以被重复利用。可以理解为,小程序的作用不是“替代获客渠道”,而是把原本一次性的流量转化为可持续运营的用户资…

作者头像 李华
网站建设 2026/4/16 1:34:16

IgH EtherCAT 从入门到精通:第 5 章 多主站与系统集成配置

第 5 章 多主站与系统集成配置 当你的系统中只有一台 EtherCAT 主站时,配置相对简单。但在工业现场,我们经常需要同时运行多个主站实例来控制不同的 EtherCAT 网段,还需要让主站服务开机自启动、合理分配设备权限、优化内核参数以获得最佳实时性能。本章将带你完成从单主站到…

作者头像 李华