深入abstract class和interface (1)

Android OTA 升级实战指南:从原理到实现 本文详细解析了Android OTA升级的原理与实现方法,包括AB升级与Recovery升级的机制对比、OTA升级包制作流程以及应用层升级功能的实现。通过实战案例和常见问题排查指南,帮助开发者掌握Android系统无线升级技术,提升设备维护效率。 阅读详情
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。 abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意。

其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。

一、理解抽象类

abstract class和interface在Java语言中都是用来进行抽象类(本文中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法,请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open -Closed Principle),抽象类是其中的关键所在。

二、从语法定义层面看abstract class和interface

在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下:

abstract class Demo { 
 abstract void method1(); 
 abstract void method2(); 
 … 
}


使用interface的方式定义Demo抽象类的方式如下:

interface Demo { 
 void method1(); 
 void method2(); 
 … 
}


在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊形式的abstract class。

从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。

首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。

其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会 增加一些复杂性,有时会造成很大的麻烦。

在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过 abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。

同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。

三、从设计理念层面看abstract class和interface

上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。本文将从另一个层面:abstract class和interface所反映出的设计理念,来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概念的本质所在。

前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。

考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:

使用abstract class方式定义Door: 

abstract class Door { 
 abstract void open(); 
 abstract void close(); 
} 

使用interface方式定义Door: 

interface Door { 
 void open(); 
 void close(); 
}
STM32F103VET6实战:用W25Q64外部Flash实现Bootloader远程升级(含完整代码解析) 本文详细介绍了基于STM32F103VET6与W25Q64外部Flash的Bootloader远程升级实现方案,包含硬件选型、存储分区策略、双校验机制及完整代码解析。通过SPI接口实现固件存储与升级,适用于物联网设备开发,提升OTA功能可靠性。 阅读详情

相关推荐

PDF.js实现分片加载问题

PDF.js实现分片加载问题。

qq_32822693的博客 4980

abstract class和interface的使用场景分别是什么?(1)

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取一、从语法定义层面看abstract class和interfaceJava代码privatelongdealsId;//交易流水号privatelong//套流水号private//产品类别private//录入渠道private//交易类型private// 特殊交易标识private//业务发生行private//客户号private//客户名称。

2401_84584552的博客 1182

Mediapipe手势识别实战——基于关节角度计算实现动态手势分类

本文详细介绍了如何利用Mediapipe进行手势识别,通过计算手指关节弯曲角度实现动态手势分类。文章从基础原理出发,讲解了关节角度计算的数学方法,并提供了Python实现代码。同时,还分享了数字手势和OK手势的识别实战经验,以及性能优化和工程实践中的关键技巧,帮助开发者快速掌握实时手势识别技术。

weixin_26891599的博客 403

java中的abstract class和interface(1)

abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很

particle_1979的专栏 678

Obsidian免费同步全攻略:手把手教你用OneDrive+Remotely Save插件跨设备同步笔记

本文提供了一份详细的Obsidian免费同步方案指南,核心是利用OneDrive云存储与Remotely Save插件实现跨设备笔记同步。文章手把手教学,涵盖插件安装、OneDrive授权配置、桌面端与移动端的同步设置,并解答了常见问题,帮助用户在不依赖官方付费服务的情况下,构建稳定、自主的免费同步工作流。

bash7scripter的博客 851

别再为模糊的3D重建头疼了!手把手教你用3DSlicer处理DICOM数据,搞定医学影像三维可视化

本文详细解析了医学影像三维重建中常见的模糊问题,并手把手教你使用3DSlicer处理DICOM数据,实现精准的三维可视化。从层厚设置到数据格式转换,再到重建算法选择和渲染参数微调,提供了一套完整的优化方案,特别适合临床医生和医学影像处理人员提升工作效率。

weixin_28693447的博客 251

[Java开发问题-1] 详细解析Java中abstract class和interface的区别

今天在网上看到一篇关于Java中abstract class和interface区别的分析,觉得比较深刻,所以转到这里来让大家共同欣赏。 原文出处:http://dev.yesky.com/436/7581936.shtml 在Java语言中,abstract class 和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abs

石圣的专栏 1656

HTTP 代理服务器的设计与实现

HTTP 代理服务器的设计与实现 首先当然是最重要的代码:github地址 1) 实验目的 熟悉并掌握 Socket 网络编程的过程与技术;深入理解 HTTP 协议,掌握 HTTP 代理服 务器的基本工作原理;掌握 HTTP 代理服务器设计与编程实现的基本技能。 2) 实验内容 基于 java 实现了基本功能与全部附加功能,并增加了 https 的支持 (1) 设计并实现一个基本 HTTP 代理服...

qq_42754642的博客 1888

Trivial_1_abstract class and interface

abstract class cannot construct by itselfabstract method to force the children to implement it.new class can only extend once.more reasonable to say BMB extends Car() interface

github_36794142的博客 180

Cadence PCB SI仿真实战:如何手动添加VIA过孔模型提升板级链路精度

本文详细介绍了在Cadence PCB SI仿真中如何手动添加VIA过孔模型以提升DDR4/5设计的精度。通过参数化建模和三维全波建模技术,工程师可以有效解决高速设计中的信号完整性问题,显著降低仿真误差。文章还提供了实战案例和常见问题解决方案,帮助优化板级链路性能。

weixin_28683391的博客 412

七段数码管动态显示技术:分时复用与使能端优化

本文深入解析了七段数码管动态显示技术的核心原理,重点阐述了分时复用与使能端优化如何协同工作。通过利用人眼视觉暂留效应,分时复用技术以一套数据线驱动多个数码管,而合理的使能端控制则是消除鬼影、保证亮度均匀的关键。文章提供了从硬件基础到Verilog代码实战的完整指南,帮助开发者实现稳定高效的动态显示系统。

lilh34434的博客 213

(2.1.15)抽象类abstract class和接口interface的区别

相同点: 都是支持抽象类定义的两种机制都不能被直接实例化其子类或实现类都必须实现了对应的抽象方法后才能实例化 ps:abstract只能修饰类和方法 不同点: 【关键词】接口interface使用关键词implements实现,抽象类abstract class使用关键词extends继承【方法】接口中只能有方法的定义,不能有实现,只能默认被public和abstrac

JAVA成长之路 741

基于 Arduino 的鱼缸水质检测控制系统设计

本系统通过多传感器实时采集鱼缸水质参数(pH 值、温度、溶解氧、浊度),经 Arduino 主控芯片处理后,驱动执行模块自动调节水质,并通过显示模块实时展示数据。系统具备阈值报警、自动换水、温度调节、增氧等功能,适用于家庭或小型水族箱的水质智能管理。本设计提供了低成本、易扩展的鱼缸水质管理方案,适用于家庭水族箱或小型水产养殖场景,可根据实际需求调整传感器类型和控制逻辑。注:本设计如有疑问需要解惑可直接私信本人,看我个人简介。

weixin_42300449的博客 1087

关于interface 和abstract class以及普通的class的区别

首先声明:方法有两种abstract 和普通方法;abstract修饰的方法交抽象方法,不需要方法体; 如图,在eclipse中创建一个abstract class,其中定义一个抽象方法 ,这个方法要是有方法体就会报错。 1.interface中方法默认是抽象抽象方法,abstract class则相反 (1)interface中的方法默认为abstract,即使你不加abstract修饰符他也是抽象方法,不能有方法体;但JDK1.8之前里面只能有抽象方法,不能有方法体的,但是1.8之后interface

qq873143381的博客 795

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java基础概念浅谈(1)——应用层面上interface(接口)和abstract class(抽象类)的区别

学习Spring源码已经有一段时间了,对代码设计有了一些收获,因此记录一下。 我们常用到的类主要分为接口(interface)、抽象类(abstract class)以及实现类(class)。在代码中经常遇到这些java文件,在我学习Spring源码之前,更多是是生搬硬套,例如Dao层、Service层用interface,高级一点就是工厂模式、策略模式用一下interface,如果发现在设计模...

Heykeel的博客 429

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

_004_Java习题_JDK1.8之前抽象类(abstract class)和接口(interface)有什么异同?

不同: 抽象类: 1.抽象类中可以定义构造器 2.可以有抽象方法和具体方法 3.抽象类中的成员可以是 private、默认、protected、public 4.抽象类中可以定义成员变量 5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法 6.抽象类中可以包含静态方法 7.一个类只能继承一个抽象类 接口: 1.接口中不能定义构造器 2.方法全部都是抽象方法 3.接口中的成员全都是...

poiuyppp的博客 1050

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

笔试题之interface和abstract class之间的区别

interface和abstract class之间有哪些区别?在C#中 1.首先abstract class 还是class,所以可以有数据成员,interface不可以 2.abstract class 可以有非abstract方法,而且可以有方法的实现,interface的方式不能有实现 3.abstract class 只能单继承,interface可以多继承。 4.interfa...

weixin_30575309的博客 105

2021-03-03

java 1.8 接口 关键字interface和implements final修饰的变量赋值有三种方式:执行顺序,静态代码块,定义属性,构造代码块,也就是static{},赋初始值,static可以省略,只用{},然后是构造函数,如果被final修饰,则构造函数不能赋值。被final修饰的对象,仅仅是引用不能改变,但内部的属性可以修改。 接口中可以定义变量,默认的是 public static final修饰,自定义修饰无效,可以直接省略所有修饰符。实现类中可以直接使用属性值,用法和自生属性..

qq_38865022的博客 176

待看文章

ORACLE SQL性能优化系列1-14文档中搜索吧……深入理解abstract class和interfacehttp://dev.youkuaiyun.com/article/56/article/58/58170.shtm

翔宇的blog..... 1122

.NET C#继承之自我解析:同签名方法派生自实体类、接口、抽象类后的生成结果

一句话:编程问题还是要靠自己动手来验证解决! 解决方案是控制台下创建的,这里把整个解决方案贴出来。 5个文件:Program.cs,Class1.cs,Class2.cs,InterFace1.cs,Abstract1.cs。 1. Program.cs using System; using System.Collections.Generic; using System.L

Faks8622的专栏 1322

xml

org.xml.sax   org.w3c.dom   原来这些是标准 xerces是实现

zhjdg 453

java 接口知识梳理

在千峰“逆战”学习第17天 关键字: interface 接口 UI Design User Interface 格式: interface 接口名 { 成员变量 成员方法 } 要求: 1. 接口名要求符合命名规范,大驼峰命名法!!!见名知意 2. 成员变量【缺省属性】 public static final 定义时必须初始化 3. 成员方法【缺省属性】 public abstract 方法没有方法体 接口可以使用extends完成继承,并且允许多继承存在 abstract修饰的方法

zzz的博客 241

interface和abstract class的区别

interface和abstract class的区别 首先我们得知道interface和abstract class是什么? interface 接口(在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。) abstract class抽象类(指的是用关键字abstract修饰的类,叫做抽象类,是不...

搬砖小白 1100

abstract class和interface的区别

在Java语言中,abstract class和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很

南国樱花祭 306
上一篇: 【转载】分享Swing学习的一些经验
下一篇: 深入abstract class和interface (2)
start_java
博客等级 码龄22年 5粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值