news 2026/3/20 3:30:33

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/3/18 8:09:44

商业赋能,全球共生!COSCon‘25 开源全球商业化论坛议程正式发布

中国开源年会 COSCon 是业界最具影响力的开源盛会之一,由开源社在 2015 年首次发起,2016 年正式得以命名。九年来,中国开源年会以其独特的中立社区定位及日益增加的影响力,吸引了越来越多国内外企业、高校、开源组织和社区的大力支…

作者头像 李华
网站建设 2026/3/15 11:14:22

SM3国密算法PHP实现终极指南:快速构建安全加密应用

SM3国密算法PHP实现终极指南:快速构建安全加密应用 【免费下载链接】SM3-PHP 国密标准SM3的PHP实现 项目地址: https://gitcode.com/gh_mirrors/sm3/SM3-PHP 在当今数据安全日益重要的时代,国产密码算法SM3凭借其强大的安全性能,正在成…

作者头像 李华
网站建设 2026/3/15 14:58:44

3步搭建专业级后台管理系统:Art Design Pro终极配置手册

3步搭建专业级后台管理系统:Art Design Pro终极配置手册 【免费下载链接】art-design-pro 这是一个基于 Vue3、TypeScript、Vite 和 Element-Plus 精心打造的后台管理系统模板,专注于用户体验和视觉设计。 项目地址: https://gitcode.com/GitHub_Trend…

作者头像 李华
网站建设 2026/3/15 11:27:14

D3.js标签防重叠实战:5步打造零冲突的专业级数据可视化

在数据可视化领域,标签重叠是影响图表可读性的主要问题。当密集的数据点标签相互遮挡时,再精美的设计也会失去价值。D3.js作为业界领先的可视化库,通过其强大的物理模拟引擎和智能算法,让标签自动避让变得简单高效。本文将带你从零…

作者头像 李华
网站建设 2026/3/15 11:42:30

Pts物理引擎实战:构建动态粒子系统的完整指南

Pts物理引擎实战:构建动态粒子系统的完整指南 【免费下载链接】pts A library for visualization and creative-coding 项目地址: https://gitcode.com/gh_mirrors/pt/pts 你是否曾想过在网页中创建逼真的物理效果,让粒子像真实世界一样相互碰撞、…

作者头像 李华
网站建设 2026/3/15 11:18:28

现代软件架构演进:从单体到云原生 + 代码实战详解

现代软件架构演进:从单体到云原生 代码实战详解目标读者:具备基础后端开发经验,希望深入理解架构落地细节的中高级开发者。一、单体架构:一个 Flask 单体应用示例 场景 我们构建一个简易电商系统,包含用户注册、商品浏…

作者头像 李华