面向抽象和面向接口的区别

news2024/11/23 13:31:24

‌1.概念

01、抽象类

        在 Java 中,通过关键字 abstract 定义的类叫做抽象类。Java 是一门面向对象的语言,因此所有的对象都是通过类来描述的;但反过来,并不是所有的类都是用来描述对象的,抽象类就是其中的一种。

        以下示例展示了一个简单的抽象类:

// 个人认为,一名教练必须攻守兼备
abstract class Coach {
	public abstract void defend();

	public abstract void attack();
}

 02、接口

        我们知道,有抽象方法的类被称为抽象类,也就意味着抽象类中还能有不是抽象方法的方法。这样的类就不能算作纯粹的接口,尽管它也可以提供接口的功能——只能说抽象类是普通类与接口之间的一种中庸之道。

        接口(英文:Interface),在 Java 中是一个抽象类型,是抽象方法的集合;接口通过关键字 interface 来定义。接口与抽象类的不同之处在于:

  • 1、抽象类可以有方法体的方法,但接口没有。
  • 2、接口中的成员变量隐式为 static final,但抽象类不是的。
  • 3、一个类可以实现多个接口,但只能继承一个抽象类。

        以下示例展示了一个简单的接口:

// 隐式的abstract
interface Coach {
	// 隐式的public
	void defend();
	void attack();
}

2.抽象类和接口的区别

抽象类和接口都是面向对象编程中用来定义规范的概念,但它们之间存在一些关键区别。

        首先,‌定义和功能上的区别‌:

  • 接口‌是一些方法的集合,没有任何实现代码,所有方法都是抽象的。接口定义了一个对象应该具有哪些功能,但并不关心这些功能的实现。接口通过实现它的类来实现功能‌。
  • 抽象类‌可以包含抽象方法和具体方法,但不能被实例化。抽象类定义了一个对象应该具有哪些特征和行为,但没有提供具体实现。抽象类通过子类来继承和实现抽象方法‌。

        其次,‌语法和设计上的区别‌:

  • 接口‌的特点包括:
    • 接口中的方法默认是公开的。
    • 接口中的变量默认是public static final
       类型的。
    • 一个类可以实现多个接口,但不能继承多个接口(可以通过默认方法实现多个接口的功能)‌。
  • 抽象类‌的特点包括:
    • 抽象类中的方法可以是公开、受保护或私有。
    • 一个类只能继承一个抽象类。
    • 抽象类可以提供一些方法的默认实现,而接口中的方法默认是没有实现的‌。

        最后,‌使用场景和设计理念的区别‌:

  • 接口‌强调“是什么”的关系,即一个类实现接口表明了这个类属于某个体系,应该具备某些功能。接口是一种规范,定义了组件应该如何被使用,但不涉及具体实现细节‌。
  • 抽象类‌则强调“is-a”的关系,即一个类继承抽象类表明了这个类是某种类型的具体实现。抽象类不仅定义了规范,还提供了部分实现,是一种模板设计方法‌。

3.白话解释 

        抽象类是对一种事物的抽象,即对类抽象,继承抽象类的子类和抽象类本身是一种 is-a 的关系。而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。

        举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类 Airplane,将鸟设计为一个类 Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。

        此时可以将 飞行 设计为一个接口 Fly,包含方法 fly(),然后 Airplane 和 Bird 分别根据自己的需要实现 Fly 这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承 Airplane 即可,对于鸟也是类似的,不同种类的鸟直接继承 Bird 类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

        接口是对类的某种行为的一种抽象,接口和类之间并没有很强的关联关系。

        抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过 ppt 里面的模板,如果用模板 A 设计了 ppt B 和 ppt C,ppt B 和 ppt C 公共的部分就是模板 A 了,如果它们的公共部分需要改动,则只需要改动模板 A 就可以了,不需要重新对 ppt B 和 ppt C 进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。

 

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

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

相关文章

接口测试常用工具及测试方法

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信…

vue基础语法的用法(API组合式风格)

一、项目文件结构 .vscode我们在那个编辑器中编辑时就会有对应的这个文件夹,不是固定的 进行编写代码前先把资源自带的页面删除,以防误导,可以像我一样的删除内容 vue文件结构 二、你好 vue el插值 script代码 v-text插值 script代码 三、…

A2P云短信应用场景

中国联通国际公司产品之 A2P 云短信 在当今这个全球化的商业环境中,企业要想在激烈的市场竞争中脱颖而出,不仅需要提供优质的产品和服务,还需要建立起与客户之间的紧密沟通桥梁。中国联通国际公司凭借其强大的国际通信能力和丰富的行业经验&…

麒麟信安参编《信息技术应用创新 移动智能终端操作系统测试规范》

9月20日,广州信创协会团体标准编制培训会暨参编证书颁发仪式在北京举行。会上颁发了T/GZXC 003-2024《信息技术应用创新 移动智能终端操作系统测试规范》团体标准参编证书。麒麟信安作为重点参编单位之一,凭借在移动智能终端操作系统测试领域的丰富实践经…

Python微震波频散相速分析

🎯要点 在二维均匀介质均匀源中合成互相关函数以便构建波层析成像。闭环系统中微积分计算情景:完美弹性体震波、随机外力对模式的能量分配。开环系统中微积分计算情景:无数震源激发波方程、闭合曲线上的随机源、不相关平面波事件。整理地震波…

鸿蒙NEXT开发-面试题库(最新)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

LUCEDA IPKISS Tutorial 77:在版图一定范围内填充dummy

案例分享:在给定的Shape内填充dummy 所有代码如下: from si_fab import all as pdk from ipkiss3 import all as i3 from shapely.geometry import Polygon, MultiPolygon import numpy as np import matplotlib.pyplot as pltclass CellFilledWithCon…

【AI换脸】Rope一键整合包,实现视频多人实时换脸

随着人工智能技术的发展,人们越来越注重人机交互的趣味性和实用性。AI换脸技术正是在这种背景下兴起的一种创新应用。Rope换脸工具以其易用性和卓越的效果,成为了众多用户和专业人士青睐的对象。 Rope是什么? Rope是一款开源的deepfake软件&…

Redis 的安装与部署(图文)

前言 Redis 暂不支持Windows 系统,官网上只能下载Linux 环境的安装包。但是启用WSL2 就可以在Windows 上运行Linux 二进制文件。[要使此方法工作,需要运行Windows 10 2004版及更高版本或Windows 11]。本文在CentOS Linux 系统上安装最新版Redis&#xf…

健身房预约小程序开发,高效管理健身场馆!

随着社会生活的提高,健身成为了人们在日常生活中的必要选择,而健身房也随之成为了大众经常光顾的地方。健身房预约管理系统是一个便捷预约健身的平台,可以让大众灵活预约,提高健身的便捷性和服务体验。同时,健身场馆也…

JAVA 并发八股

线程与进程区别 进程是正在运行的程序的实例,进程中包含了线程,每个线程执行不同的任务 不同进程使用不同的内存空间,在当前进程下所有线程可以共享内存空间 线程更轻量,线程上下文切换成本一般上要比进程上下文切换低&#xff0…

vueJS中wowjs、animate、swiper的使用

原文关注公众号 本文演示利用swiper纵向全屏滚动 npm 安装 wow.js,安装 wow.js后animate.css会自动安装; npm install wowjs --save-dev npm 安装 animate.css animate.css文档:http://5kzx.cn/doc.html npm install animate.css --save …

Python和MATLAB及C++和Fortran胶体粒子数学材料学显微镜学微观流变学及光学计算

🎯要点 二维成像拥挤胶体粒子检测算法粒子的局部结构和动力学分析椭圆粒子成链动态过程定量分析算法小颗粒的光散射和吸收活跃物质模拟群体行为提取粒子轨迹粘弹性,计算剪切模量计算悬浮液球形粒子多体流体动力学概率规划全息图跟踪和表征粒子位置、大小…

创建docker虚拟镜像,创建启动服务脚本

进入系统命令服务目录 编辑服务 [Unit] DescriptionDocker Application Container Engine Documentationhttps://docs.docker.com Afternetwork-online.target firewalld.service Wantsnetwork-online.target [Service] Typenotify ExecStart/usr/bin/dockerd ExecReload/bin/…

Gradle 插件获取所有依赖项,类似 androidDependencies?

诉求 在打包过程中我想知道某个模块的信息,比如: 模块androidx.work:work-runtime是否被依赖?模块androidx.work:work-runtime的版本号是多少? 我们利用 Android studio 已有的任务androidDependencies,双击执行很容…

PyQt5写好的py文件生成可执行的exe文件【Nuitka】

文章目录 1.Nuitka引入2.Nuitka与Pyinstaller对比Nuitka安装 3.Nuitka指令4.参数以及作用5.多文件格式封装完成后可删除文件6.运行问题问题1问题2 1.Nuitka引入 看过我上一篇PyQt5写好的py文件生成可执行的exe文件【Pyinstaller】的应该了解到用PyQt5写的界面程序可以通过Pyins…

安卓冻屏bug案例作业分享-千里马学员wms+input实战作业

背景: 近期有学员反馈在aosp14高版本上有了一个新窗口TaskBar,这个但是有需求就是对这个TaskBar进行隐藏,所以有一个需要对这个TaskBar进行进行隐藏需求 隐藏TaskBar需求做了之后发现有如下bug: 问题复现步骤: 因…

新款示波器RTE1104罗德与施瓦茨RS RTE1102原装二手

罗德与施瓦茨R&S RTE1104触摸屏RTE1102新款示波器 R&S-RTE1000 示波器系列: RTE1022标配:200MHz带宽,2通道,5GSa/s采样率,200M存储深度,16个数字通道(选配) RTE1032标配&a…

HCIP--以太网交换安全(二)端口安全

端口安全 一、端口安全概述 1.1、端口安全概述:端口安全是一种网络设备防护措施,通过将接口学习的MAC地址设为安全地址防止非法用户通信。 1.2、端口安全原理: 类型 定义 特点 安全动态MAC地址 使能端口而未是能Stichy MAC功能是转换的…