news 2026/4/18 11:41:45

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/4/18 8:16:47

31、Perl编程调试指南:策略与常见错误处理

Perl编程调试指南:策略与常见错误处理 在编程的世界里,编写代码只是第一步,让代码正确运行才是真正的挑战。Perl作为一种强大的脚本语言,在编写脚本时也会遇到各种错误。本文将深入探讨Perl脚本的调试策略以及常见错误信息的处理方法。 调试的重要性与错误分类 编写Perl…

作者头像 李华
网站建设 2026/4/18 8:07:19

为什么有的程序员很抗拒使用AI?

最近发现一个有趣现象:AI工具铺天盖地,但身边不少资深程序员朋友反而对其保持距离,甚至有些抗拒。这种“守旧”背后,究竟是技术人的固执,还是有着更深的职业洞察? 主题:为什么有的程序员很抗拒使…

作者头像 李华
网站建设 2026/4/17 22:10:50

React CSS Modules完整升级指南:从旧版本平滑迁移到4.3.0

React CSS Modules完整升级指南:从旧版本平滑迁移到4.3.0 【免费下载链接】react-css-modules Seamless mapping of class names to CSS modules inside of React components. 项目地址: https://gitcode.com/gh_mirrors/re/react-css-modules React CSS Mod…

作者头像 李华
网站建设 2026/4/17 21:46:46

IntelliJ IDEA 免费版正式发布!真香!!

点击关注公众号,Java 干货及时推送↓推荐阅读:今年金九银十的实感。。大家好,我是R哥。最近 IntelliJ IDEA 2025.3 版本发布了,这次,IntelliJ IDEA 2025.3,真正把免费版和收费版做到一起的版本,…

作者头像 李华
网站建设 2026/4/18 5:42:41

“授权“和“转授权“有何不同?

点击标题下「蓝色微信名」可快速关注最近工作中碰到两个名词,"授权"和"转授权",看着很相近,有什么区别?"授权"和"转授权"是权力或权限传递链条上的不同环节,核心区别在于权力…

作者头像 李华