Java中的接口和抽象类

Java 抽象类与接口:区别、应用与选择

在 Java 编程的世界里,抽象类和接口是两个极为重要的概念,它们在实现代码抽象、提高代码复用性和可维护性方面发挥着关键作用。然而,很多开发者在使用时容易混淆这两个概念。本文将深入探讨 Java 中抽象类和接口的区别、各自的应用场景,帮助你在实际开发中做出更合适的选择。

语法层面的差异

定义方式

  • 抽象类:使用 abstract 关键字来定义。它是一种特殊的类,既可以包含抽象方法(仅有方法声明,没有方法体),也能包含具体方法(有完整的方法体)。
abstract class Shape {// 抽象方法public abstract double area();// 具体方法public void display() {System.out.println("This is a shape.");}
}
  • 接口:使用 interface 关键字定义。在 Java 8 之前,接口中的方法全部是抽象方法;Java 8 及以后,接口中可以包含默认方法(使用 default 关键字)和静态方法。
interface Drawable {// 抽象方法void draw();// 默认方法default void fillColor() {System.out.println("Filling with default color.");}// 静态方法static void info() {System.out.println("This is a drawable object.");}
}

注:不管是抽象类还是接口,其中的抽象方法必须在实现类中实现,否则会报错,如下图所示:接口中定义了run抽象方法,但在实现类中并没有实现,所以会爆红。运行会出现下下图的报错。
在这里插入图片描述
在这里插入图片描述

继承和实现规则

  • 抽象类:遵循 Java 的单继承机制,即一个类只能继承一个抽象类。这是为了避免多重继承带来的菱形继承问题(多个父类有相同方法时子类调用的歧义)。
class Circle extends Shape {private double radius;public Circle(double radius) {this.radius = radius;}@Overridepublic double area() {return Math.PI * radius * radius;}
}
  • 接口:一个类可以实现多个接口,通过这种方式可以为类添加多种不同的行为。这使得 Java 可以在一定程度上模拟多重继承的效果。
interface Resizable {void resize();
}class Rectangle implements Drawable, Resizable {@Overridepublic void draw() {System.out.println("Drawing a rectangle.");}@Overridepublic void resize() {System.out.println("Resizing the rectangle.");}
}

成员特性的不同

成员变量

  • 抽象类:抽象类可以包含各种访问修饰符(如 privateprotectedpublic)的成员变量,包括静态变量和实例变量。这些变量可以在类的不同方法中使用和修改。
abstract class Vehicle {private int wheels;protected String brand;public static int vehicleCount;public Vehicle(int wheels, String brand) {this.wheels = wheels;this.brand = brand;vehicleCount++;}
}
  • 接口:接口中的变量默认是 public static final 类型的常量,必须在声明时进行初始化,并且一旦初始化后就不能再修改。这是因为接口主要用于定义行为规范,而不是存储状态。
interface ElectricalDevice {int POWER_VOLTAGE = 220;
}

构造函数

  • 抽象类:抽象类可以有构造函数。当子类实例化时,会先调用抽象类的构造函数来完成一些初始化操作。构造函数可以用于初始化抽象类中的成员变量。
abstract class Animal {protected String name;public Animal(String name) {this.name = name;System.out.println("Animal constructor called for " + name);}
}class Dog extends Animal {public Dog(String name) {super(name);System.out.println("Dog constructor called");}
}
  • 接口:接口没有构造函数。因为接口不能被实例化,它只是定义了一组方法的规范,不需要进行对象的初始化操作。如果在接口中想要实现构造函数就会获得以下报错。
    在这里插入图片描述

设计理念与使用场景

设计理念

  • 抽象类:抽象类更侧重于对一组具有相似特征和行为的类进行抽象,它体现的是一种“is - a”的关系,即子类是抽象类的一种具体实现。例如,“水果”抽象类可以作为“苹果”“香蕉”等具体水果类的基类,因为苹果和香蕉都是水果。
  • 接口:接口强调的是一种行为契约,体现的是“can - do”的关系,即一个类实现了某个接口,就表示它具备了该接口所定义的行为能力。比如,“可排序”接口表示实现该接口的类的对象可以进行排序操作。

使用场景

  • 抽象类:当多个类具有共同的属性和行为,并且这些行为中有部分是需要根据具体情况进行不同实现时,适合使用抽象类。例如,不同类型的图形(如圆形、矩形)都有面积的属性和计算面积的行为,但计算方法不同,此时可以使用抽象类 Shape 来定义公共属性和抽象的 area() 方法。
  • 接口:当需要为不同的类添加相同的行为,而这些类之间没有明显的继承关系时,适合使用接口。例如,“打印机”类和“扫描仪”类本身没有继承关系,但它们都可以实现“可连接网络”接口,以具备网络连接的功能。

总结

抽象类和接口在 Java 编程中各有其独特的作用和优势。抽象类更适合对具有相似特征和行为的类进行抽象,强调“is - a”关系;而接口则更侧重于定义行为契约,强调“can - do”关系。在实际开发中,我们需要根据具体的业务需求和代码结构来合理选择使用抽象类或接口,以达到代码的高复用性、可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/78691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java读Excel:解析阿里云easyExcel导入文件的行号

文章目录 引言I 解析阿里云easyExcel导入文件的行号声明解析对象的基类判断Excel解析对象类型是否包含继承某个类 isAssignableFromJava 转换list类型并设置下标到元素对象属性II 封装excel 文件读取excel 文件读取用法文件导入上下文III 参数校验工具类校验参数是否合法 (jaka…

mmap核心原理和用途及其与内存映射段的关系

mmap 是 Linux/Unix 系统中的一个关键系统调用,全称是 Memory Map(内存映射)。它的核心功能是将 文件、设备或匿名内存 直接映射到进程的虚拟地址空间,从而实现高效的内存访问和操作。以下是其核心原理和用途的详细说明&#xff1…

数据库概论速成期中版

文章目录 引论数据库用户Casual usersNaive usersApplication programmersDatabase administrators 关系模型CAP数据库两种描述关系数据库的方式简单总结 第一范式规则第二范式规则举个例子符合第二规则的操作不符合第二规则的操作 第三范式规则key,superkey,null values,主键&…

解决调用Claude 3.7接口 403 Request not allowed问题

1. 遇到问题 Python 基于 Langchain 对接 Claude 3.7 大模型接口进行问答时,由于国内不在Claude支持的国家和地区,所以一直调不通,错误 anthropic.PermissionDeniedError: Error code: 403 - {error: {type: forbidden, message: Request…

Vue2+Vue3学习笔记

Vue基础介绍 下载并安装vue.js v2 https://v2.cn.vuejs.org/https://v2.cn.vuejs.org/ v3 https://v3.cn.vuejs.org/ 会重定向到Vue.js - 渐进式 JavaScript 框架 | Vue.jsVue.js - 渐进式的 JavaScript 框架https://cn.vuejs.org/ 从v2过渡到v3 在F盘创建v2v3学习笔记 并…

2025年KBS新算法 SCI1区TOP:长颖燕麦优化算法AOO,深度解析+性能实测

目录 1.摘要2.算法原理3.结果展示4.参考文献5.文章&代码获取 1.摘要 本文提出了一种新颖的元启发式算法——长颖燕麦优化算法(AOO),该算法灵感来自动画燕麦在环境中的自然行为。AOO模拟了长颖燕麦的三种独特行为:(i) 通过自然…

CentosLinux系统crontab发现执行删除命令失效解决方法

权限或安全策略限制 ​​可能场景​​: ​​### ​​目录权限冲突​​: 你的目录权限为 drwxr-xr-x(属主 mssql),但 cron 任务以 root 执行。 ​​风险点​​:若目录内文件属主为 mssql 且权限为 700&…

后验概率最大化(MAP)估计算法原理以及相具体的应用实例附C++代码示例

1. MAP估计基本原理 MAP(Maximum A Posteriori,最大后验概率估计)是贝叶斯推断中的重要概念,它的目标是: 给定观测数据,找到使得后验概率最大的参数值。 公式化表示: [ θ MAP arg ⁡ max ⁡…

16、路由守卫:设置魔法结界——React 19 React Router

一、魔法结界的本质 "路由守卫是霍格沃茨城堡的隐身斗篷,在时空裂隙中精准控制维度跃迁!" 魔法部交通司官员挥舞魔杖,React Router 的嵌套路由在空中交织成星轨矩阵。 ——基于《国际魔法联合会》第7号时空协议,路由守…

从车道检测项目入门open cv

从车道检测项目入门open cv 前提声明:非常感谢b站up主 嘉然今天吃带变,感谢其视频的帮助。同时希望各位大佬积积极提出宝贵的意见。😊😊😊(❁◡❁)(●’◡’●)╰(▽)╯ github地址:https://github.com/liz…

【行业特化篇3】制造业简历优化指南:技术参数与标准化流程的关键词植入艺术

写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offe…

如何在本地部署小智服务器:从源码到全模块运行的详细步骤

小智聊天机器人本地后台服务器源码全模块部署 作者:林甲酸 -不是小女子也不是女汉子 是大女子 更新日期:2025年4月29日 🎯 前言:为什么要写这篇教程? 上周按照虾哥小智服务器的教程去部署本地后台,我用的是…

github开源项目添加开源协议,使用很简单

直接在 GitHub 网页上创建 进入你的 GitHub 仓库 打开你的项目仓库页面(如 https://github.com/用户名/仓库名)。 点击 "Add file" → "Create new file" 在仓库主页,点击右上角的 "Add file" 按钮&#xff…

8.idea创建maven项目(使用Log4j日志记录框架+Log4j 介绍)

8.idea创建maven项目(使用Log4j日志记录框架Log4j 介绍) 在 IntelliJ IDEA 的 Maven 项目中引入了 Log4j,并配置了日志同时输出到控制台和文件。 Log4j 提供了灵活的日志配置选项,可以根据项目需求调整日志级别、输出目标和格式。 1. 创建 Maven 项目 …

【和春笋一起学C++】函数——C++的编程模块

目录 1. 原型句法 2. 函数分类 3. 函数参数之按值传递 4. 数组作为函数参数 在C中,要使用函数,必须要有这三个方面: 函数原型,函数原型描述了函数到编译器的接口,函数原型一般放在include文件中。函数原型告诉编译…

深挖Java基础之:认识Java(创立空间/先导:Java认识)

今天我要介绍的是在Java中对Java的一些基本语法的认识与他们的运用,以及拟举例子说明和运用场景,优势和劣势, 注:本篇文章是对Java的一些基本的,简单的代码块的一些内容,后续会讲解在Java中的变量类型&…

Python+Selenium+Pytest+Allure PO模式UI自动化框架

一、框架结构 allure-report:测试报告base:定位元素封装data:数据log:日志文件page:页面封装文件夹report:缓存报告testcases:测试用例层utils:工具类run.py:执行文件 二…

博物馆除湿控湿保卫战:M-5J1R 电解除湿科技如何重塑文物守护的未来

在卢浮宫幽深的长廊里,达芬奇的《蒙娜丽莎》正经历着一场看不见的战争——不是来自时间的侵蚀,而是空气中无形的水分子。每一件文物都在与湿度进行着无声的抗争,这场抗争关乎人类文明的延续。湿度,这个看不见的文物杀手&#xff0…

【嘉立创EDA】如何找到曲线和直线的交点,或找到弧线和直线的交点

文章路标👉 :one: 文章解决问题:two: 主题内容:three: 参考方法be end..1️⃣ 文章解决问题 操作环境:嘉立创EDA专业版 V2.2.38 本文使用嘉立创EDA,描述如何快速找到曲线和直线交点的方法,这里的曲线包括了弧线等。本文将此过程记录,以供有需要的读者参考。 2️⃣ 主题…

大语言模型能否替代心理治疗师的深度拓展研究:fou

大语言模型能否替代心理治疗师的深度拓展研究 在科技初创企业和研究领域,大型语言模型(LLMs)用于替代心理健康服务提供者的应用备受关注。但研究人员通过对主要医疗机构治疗指南的梳理回顾,并对当前 LLMs(如 gpt-4o)进行实验评估后发现,LLMs 存在对心理疾病患者表达污名…