当前位置: 首页 > news >正文

Java中的抽象类和接口

抽象类

抽象类(Abstract Class)是Java中一种特殊的类,主要用于继承而非实例化。它通过提取多个相关类的共性特征,为子类提供基础设计模板。抽象类定义了子类必须遵循的方法框架,而具体实现则由各个子类自行完成。
抽象类的主要特点包括:

  1. 使用abstract关键字修饰
  2. 可以包含抽象方法(没有方法体的方法)和具体实现的方法
  3. 可以包含成员变量、构造方法、普通方法等
  4. 子类继承抽象类后,必须实现所有抽象方法(除非子类也是抽象类)

示例:

abstract class Animal {private String name;public Animal(String name) {this.name = name;}// 抽象方法public abstract void makeSound();// 具体方法public void eat() {System.out.println(name + " is eating.");}
}

抽象类适用于需要定义一些共同行为但又不完全确定具体实现的场景,比如图形类中的计算面积方法,不同图形有不同的计算方式。

接口

接口(Interface)作为一种规范标准,定义了类的行为准则,它是方法特征的集合但不包含具体实现。从实现者的角度来看,接口明确规定了需要对外提供的服务能力。
主要特性如下:

  1. 采用interface关键字进行定义
  2. Java 8起支持包含默认方法和静态方法
  3. 方法默认且仅限为public abstract(可省略修饰符)
  4. 字段默认且仅限为public static final
  5. 类使用implements关键字实现接口
  6. 所有方法均为抽象方法,支持多重接口实现

实现要点:

  • 实现接口的类必须重写所有抽象方法
  • 接口间为继承关系,类与接口为实现关系
  • 作为继承机制的补充,允许同时实现多个接口

示例:

interface Vehicle {void start();  // 抽象方法default void stop() {  // Java 8默认方法System.out.println("Vehicle stopped");}static void honk() {  // Java 8静态方法System.out.println("Honk honk!");}
}

接口适用于定义行为契约,比如比较能力(Comparable)、克隆能力(Cloneable)等。Java中一个类可以实现多个接口。

抽象类和接口的对比

特性抽象类接口
关键字abstract classinterface
继承/实现方式通过extends继承通过implements实现
方法可以有抽象方法和具体方法Java 8前只能有抽象方法,之后可以有默认方法和静态方法
变量可以有各种类型的成员变量只能有public static final的静态常量
构造方法可以有不能有
多重继承不支持(一个类只能继承一个抽象类)支持(一个类可以实现多个接口,弥补Java单继承的不足)
设计目的代码复用/部分实现、模版设计模式定义行为契约/规范、提供能力/服务
访问修饰符可以有各种访问控制默认public(不能使用其他修饰符)

使用场景选择:

  • 当需要定义一些共同属性和部分实现时,使用抽象类
  • 当只需要定义行为规范时,使用接口
  • 从Java 8开始,接口和抽象类的界限变得模糊,可以根据具体情况选择

注意:在Java 9之后,接口还可以包含私有方法,进一步增强了接口的能力。

http://www.dtcms.com/a/267980.html

相关文章:

  • CICD[构建镜像]:构建django使用的docker镜像
  • 【9】用户接入与认证配置
  • 车载智能座舱用户画像系统研究二:子系统构建
  • Linux国产与国外进度对垒
  • GANs环境应用及启发思考
  • java学习——guava并发编程练习
  • 跨平台游戏引擎 Axmol-2.7.0 发布
  • @Data、@AllArgsConstructor、@NoArgsConstructor不生效。lombok不起作用怎么解决?
  • 设置LInux环境变量的方法和区别_Ubuntu/Centos
  • 网页怎么不使用工具截图和长图
  • 《Spring AI实战:Java智能开发速成指南》
  • D435i + ROS2
  • 利用selenium获取网页数据,脚本加载慢问题的解决办法
  • CentOS环境搭建-快速升级G++版本
  • 【CSS样式】有趣的滑块开关
  • 深入理解 classnames:React 动态类名管理的最佳实践
  • 20250706-6-Docker 快速入门(上)-镜像是什么?_笔记
  • TNNLS期刊接受后,最终版提交说明
  • QT - QCustomPlot
  • Next.js面试常问内容详解
  • 【网络安全基础】第八章---电子邮件安全
  • 5种高效解决Maven依赖冲突的方法
  • 基于SpringBoot和Leaflet集成在线天气服务的区县当前天气WebGIS实战
  • 手机电工仿真软件更新了
  • Typecho主题开发指南:现代框架布局与SEO优化实践
  • 基于SSM和JSP开发的旅游系统
  • [论文阅读] 人工智能 + 软件工程 | 自然语言驱动结构代码搜索:突破DSL学习壁垒的创新方法
  • HRDNet: High-resolution Detection Network for Small Objects论文阅读
  • 7.6 hash | rust
  • 408第三季part2 - 计算机网络 - 传输层II