news 2026/6/23 3:37:51

Java抽象类与接口详解:从语法到设计的核心区别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java抽象类与接口详解:从语法到设计的核心区别

抽象类

用修饰符abstract修饰类,可以定义抽象类。

抽象类的可以定义抽象方法,或者说有定义抽象方法的类必须是抽象类,抽象方法不能有方法的实现代码体。

抽象类中可以有普通方法,并且abstract只能修饰方法,不能修饰属性。

// 用修饰符abstract定义抽象类publicabstractclassAbstractClass{// 用修饰符abstract定义抽象方法,抽象方法不能有方法体publicabstractvoidsay();publicabstractvoidrun();// 可以定义普通方法publicvoidshow(){System.out.println("抽象类中的普通方法");}// 可以定义变量,变量不能用abstract修饰publicStringname;publicintage;}

抽象类不能被new实例化,要实例化,需要在子类重写抽象方法。(当然,子类也可以是抽象类,此时就可以继续抽象下去,无需实现父类的抽象方法)在抽象类的子类实例化对象后,可以利用多态特性,让抽象类的引用指向子类的对象。

publicclassImplementClassextendsAbstractClass{// 实现父抽象类的抽象方法@Overridepublicvoidsay(){System.out.println("say");}// 实现父抽象类的抽象方法@Overridepublicvoidrun(){System.out.println("run");}}
publicclassApp{publicstaticvoidmain(String[]args){// new AbstractClass(); 无法实例化抽象类// 可以实例化抽象类的已重写抽象方法的子类AbstractClassa=newImplementClass();a.run();// 调用抽象类中,已重写抽象方法的子类方法a.show();// 调用继承抽象类的非抽象方法}}

为什么会有抽象类?抽象类是介于接口和普通实现类的中间过渡,既有类的特性,又有接口的特性:

  1. 像接口一样,能够定义抽象方法,抽象方法可以理解成定义一套规范。这套规范指导子类,并且强制要求子类实现。
  2. 像类一样,能够定义实现方法,让子类直接继承抽象父类的具体已实现的方法。
  3. 像类一样,是单继承关系,不想接口一样支持多继承。某些场景下单继承可能是更优选择。

接口

接口是比抽象类更完全的抽象,接口使用interface定义。由于接口必须用于其他类进行实现,所以必须是public公开的,因此不能定义private、default、protected。

接口也可以不用public做修饰符,即非全局访问,限制只有同包类可以访问。

// 包私有接口,只有同包类可以访问interfacePackagePrivateInterface{}// 公共接口,所有类都可以访问publicinterfacePublicInterface{}

与抽象类中可以有抽象方法和非抽象方法不同,接口中的方法必须是抽象方法(Java8以前)。并且由于抽象方法必须是公开的,所以可以不需要定义修饰符,因为隐式使用 public abstract 。

publicinterfaceDemo{// 公开的抽象方法(隐式 public abstract)voidsayHello();// 公开的默认方法(必须是 public)defaultvoiddefaultMethod(){privateHelper();}// 私有方法(Java 9+)privatevoidprivateHelper(){// 只能在接口内部调用}}

在Java8之后,接口除了有抽象方法外,还可以有默认方法、静态方法和私有方法。

  • 默认方法:使用default关键字修饰,有方法体。实现类可以直接继承或重写它。
  • 静态方法:使用static关键字修饰,有方法体。属于接口自身,通过接口名.静态方法名()调用。
  • 私有方法:使用 private 关键词修饰,只能在接口内部调用。

与抽象类相似,接口也不能实例化,必须通过子类重写抽象方法进行实现。但是抽象类使用extends关键字标记子类,而接口使用implement关键字标记实现接口的类。

publicclassDemoImpimplementsDemo{// 重写(实现)接口中的抽象方法@OverridepublicvoidsayHello(){System.out.println("hello");}@OverridepublicvoidsayHi(){System.out.println("hi");}}

与抽象类不同,接口可以多继承,子类必须重写多个接口的抽象方法。

publicclassDemoImpimplementsDemo0,Demo{// 需要重写多个继承接口的全部方法。}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 18:51:12

Moonlight安卓串流终极指南:手机畅玩PC游戏的完整教程

你是否曾经想过,在手机上就能流畅运行《赛博朋克2077》或《艾尔登法环》这样的PC大作?Moonlight安卓串流技术让这个梦想成为现实。本文将为你提供从环境配置到性能优化的完整解决方案。 【免费下载链接】moonlight-android GameStream client for Androi…

作者头像 李华
网站建设 2026/6/23 18:52:00

强化学习第六课 —— SAC:熵驱动的更智能探索

目录 引言:不仅仅是为了赢 第一章:最大熵目标——混乱中的秩序 2.1 传统 RL 的局限 2.2 引入熵奖励:J(π)J(\pi)J(π) 的重构 第二章:软策略迭代——数学推导的核心 3.1 软值函数与软 Bellman 方程 3.2 策略评估与策略提升 第三章:SAC 的工程实现——Actor 与 Critic 的共…

作者头像 李华
网站建设 2026/6/23 6:04:27

VeraCrypt加密存储实战:5步构建企业级数据安全防线

VeraCrypt加密存储实战:5步构建企业级数据安全防线 【免费下载链接】VeraCrypt Disk encryption with strong security based on TrueCrypt 项目地址: https://gitcode.com/GitHub_Trending/ve/VeraCrypt 在数据泄露频发的今天,如何确保敏感信息在…

作者头像 李华
网站建设 2026/6/22 21:29:39

9 个专科生开题演讲稿工具,AI降AI率软件推荐

9 个专科生开题演讲稿工具,AI降AI率软件推荐 论文写作的困境:时间、重复率与手工降重的双重压力 对于专科生来说,撰写开题演讲稿并不是一件轻松的事情。它不仅需要扎实的专业知识,还需要良好的文字表达能力。然而,现实…

作者头像 李华
网站建设 2026/6/23 19:11:22

Flutter Dynamic Widget 终极指南:用JSON构建动态UI的完整教程

Flutter Dynamic Widget 终极指南:用JSON构建动态UI的完整教程 【免费下载链接】dynamic_widget A Backend-Driven UI toolkit, build your dynamic UI with json, and the json format is very similar with flutter widget code. 项目地址: https://gitcode.com…

作者头像 李华
网站建设 2026/6/23 19:10:13

MacBook 那些“偷偷摸摸”的隐私设置|2026 你现在就该改(真的)

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我我前阵子刚把 iPhone 盘了一遍,才发现它一直在“记录我的人生轨迹”。结果今天早上坐下打开 MacBook 工作,我突然意识到&#xff…

作者头像 李华