抽象类和接口的区别简单总结

创建型模式之简单工厂模式——接口和抽象类 一张图讲明白简单工厂 阅读详情

搞java几年了突然被领导问了这么一个问题,最终没有说服领导,看了一些资料现在总结一下。

1、语法层面上的区别

  •  1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  •  2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  •  3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  •  4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。

2、设计层面上的区别

1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类 Airplane,将鸟设计为一个类 Bird,但是不能将 飞行这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 "是不是"的关系,而 接口 实现则是 "有没有"的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。

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

下面看一个网上流传最广泛的例子:门和警报的例子:门都有 open() 和 close() 两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

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

或者:

interface Door {
    public abstract void open();
    public abstract void close();
}

但是现在如果我们需要门具有报警 的功能,那么该如何实现?下面提供两种思路:

1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的 open( ) 和 close( ),也许这个类根本就不具备 open( ) 和 close( ) 这两个功能,比如火灾报警器。

从这里可以看出, Door 的 open() 、close() 和 alarm() 根本就属于两个不同范畴内的行为,open() 和 close() 属于门本身固有的行为特性,而 alarm() 属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含 alarm() 行为,Door 设计为单独的一个抽象类,包含 open 和 close 两种行为。再设计一个报警门继承 Door 类和实现 Alarm 接口。

interface Alram {
    void alarm();
}
 
abstract class Door {
    void open();
    void close();
}
 
class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}
CANoe UDS $27服务DLL生成实战:从工程配置到算法修改全流程 本文详细介绍了在Vector CANoe中为UDS(统一诊断服务)的$27安全访问服务生成定制化DLL(动态链接库)的全流程。从定位官方参考工程、配置Visual Studio开发环境,到深入解析核心的GenerateKeyEx函数接口,并重点演示了如何修改和实现自定义的种子-密钥安全算法,最终完成DLL的编译、部署与CANoe集成测试,为汽车电子诊断开发提供实战指导。 阅读详情

相关推荐

携程景点评论数据爬取实战:破解AJAX动态加载与分页参数逆向分析

本文详细介绍了携程景点评论数据爬取的实战经验,重点破解了AJAX动态加载与分页参数逆向分析的技术难题。通过分析`getCommentCollapseList`接口,解析动态参数如`poiId`和`pageIndex`,并实现分页逻辑,帮助开发者高效获取评论数据。文章还提供了完整的Python爬虫代码和反爬策略,适用于数据分析与内容挖掘。

weixin_29098367的博客 673

c#接口和抽象类的区别

http://www.cnblogs.com/zhangzheny/archive/2007/12/24/1012790.html 大家都容易把这两者搞混,我也一样,在听李建忠老师的设计模式时,他也老把抽象类说成接口,弄的我就更糊涂了,所以找了些网上的资料.       一、抽象类:       抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方

mituan1234567的专栏 2025

QFN封装芯片手工焊接实战:从焊盘处理到拖焊技巧

本文详细介绍了QFN封装芯片手工焊接的全过程,从焊盘处理到拖焊技巧,再到常见问题的现场修复方法。通过实战经验分享,帮助工程师和DIY爱好者掌握0.5mm小间距QFN芯片的焊接技术,提升焊接成功率和质量。重点讲解了垂直与平行拖焊手法的对比应用,以及焊后清理与质量检验的关键步骤。

weixin_42652674的博客 531

接口和抽象类的区别

不同点: 1、接口只能定义抽象方法不能实现方法,抽象类既可以定义抽象方法,也可以实现方法。 2、单继承,多实现。接口可以实现多个,只能继承一个抽象类。 3、接口强调的是功能,具有什么能力。抽象类强调的是所属关系。4、接口中的所有成员变量 为public static final(默认,变量也是属于全局变量), 静态不可修改,当然必须初始化。接口中的所有方法都是public abstract 公开抽象的(public可不写)。而且不能有构造方法。抽象类就比较自由了,和普通的类差不多,可以有抽象方法也可以没有,

奋斗男孩的博客 1万+

[LaTeX] 使用natbib宏包实现参考文献的“作者-年份”引用格式及常见编译错误排查

本文详细介绍了在LaTeX中使用natbib宏包实现参考文献“作者-年份”引用格式的完整流程。从宏包配置、.bib文件准备到标准编译步骤,重点解析了常见的“Bibliography not compatible with author-year”错误成因,并提供了彻底清理辅助文件等解决方案,帮助用户高效排版符合学术规范的参考文献。

moon9的博客 481

硬盘dma读写过程

保护模式中,pci上的硬盘dma读写方法

480

抽象类和接口有什么区别?

抽象类和接口有什么区别?

titanium的博客 3671

局部,全局(外部),static等变量详解

首先,必须明白一个程序是包含若干个源文件,每个源文件又是包含若干个函数,每个源文件、函数中又定义了若干个变量。但是每个变量都有自己的作用范围,也就是自己的作用域。只有在作用域内才可以访问变量。 变量的有效范围称为变量的作用域( scope)。归纳起来,变量有4种不同的作用域:文件作用域( file scope)、函数作用域( function scope)、块作用域(block sc...

归根结底不优秀的博客 1322

抽象类和接口的简单区别

原来对抽象类和接口的理解总是混淆不清 最近看了一下别人写的东西,现在将个人理解写下来 方便以后查阅理解 Abstract:Extends(定义模板) 我们可以在抽象类中写一些其他的不是抽象类的方法,而因为我们是继承,所以子类也可以使用这些方法,同时我们利用抽象类的特点  是子类必须重写我们一些我们想让子类必须实现的方法,加了abstract修饰的方法。通过继承,我们即少写了一些父类中有的方法...

qq_38827988的博客 141

基于YOLOv8的植物生长阶段识别系统设计与实现

本文详细介绍了一个基于YOLOv8深度学习模型的植物生长阶段识别系统,包含完整的数据集构建、模型训练、评估以及基于PyQt5的用户界面开发过程。系统能够自动识别植物在不同生长阶段(如发芽期、生长期、开花期、结果期等)的形态特征,为精准农业和智能种植提供技术支持。文章提供了完整的代码实现,并讨论了模型优化策略和实际应用场景。关键词:植物生长阶段识别、YOLOv8、目标检测、PyQt5、深度学习。

YOLO 465

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 546

简单梳理下抽象类和接口的区别

java中的抽象类(abstract)和接口(interface)的区别: 1.一个是类,一个是接口 类更像是一种类型的提取,接口更像是一种行为的抽取 比如:动物分为胎生动物和卵生动物 即我们可以创建抽象类动物: public abstract class Animal { } 然后创建胎生动物和卵生动物 public abstract class VpAnimal exte...

S554695481的博客 419

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Java】简单列举一下抽象类和接口的区别

文章目录一、区别二、使用场景接口抽象类三、总结 一、区别 抽象类(abstract) 接口(interface) 实现 × √ 继承 √ × 能实例化 × × 实现或继承使用的关键字 extends implements 实现或继承的类叫做 子类 类 可以多继承或多实现 × √ 方法声明 √ √ 方法实现 √ × 方法的标识符 punlic、private、protected public 实现抽象方法 √ √ 变量 普通变量 静态不可修改常量

程序员徐小白的博客 308

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

简单介绍java抽象类和接口的区别

抽象类:在面向语言的概念中,所有的对象都是通过类来描绘的,但是反过来却不是这样,如果一个类中没有足够的信息去描绘一个具体的对象,那么这个类就是抽象类。 接口:不同类的对象对同一行为产生不同的行为结果,换言之既是一系列方法的声明,一些方法特征的集合,具体的实现由子类去完成。 其二者区别: 1、抽象类可以有构造方法, 而接口不能有。 2、抽象类可以有普通成员变量,而接口不能有。 3、

夏子然的博客 2555

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

简单论述抽象类和接口的区别

I、接口是特殊的抽象类,接口中的所有方法都是抽象方法,而抽象类不要求所有的方法都是抽象的; II、接口是用来实现(implements)的,而抽象类是用来继承(extends)的; III、类可以实现任意多个接口,因此,可以向上转型为多个基类型,带来更多的灵活性,所以接口可以创建更通用的代码; IV、接口可以继承(extends)多个接口类,但这仅限制于接口,对于非接口类而言,只能继承一个父

Trista_3的博客 534

根据个人理解简单介绍接口和抽象类的区别

首先分别介绍接口和抽象类: 一、抽象类: ①如果一个方法中存在不可预知方法实现时,那么这个方法所在的类可声明为抽象类。 ②如果两个或多个类中具有同名的方法,这样按照正常道理来说,应该将方法提取到父类中,但这两个或多个方法又有明显的方法实现上的不同,那么父类中的方法就应该是抽象的。 ③抽象方法只是给出方法的样子,而不给出方法的具体实现,具体实现由继承这个类的具体的子类来实现。 ④抽象方法必

love_you_99的专栏 676

C# 中抽象类和接口的区别(简单理解)

#区别 区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口.

willingtolove的博客 2620

抽象类和接口的介绍,简单工厂代码示例

抽像类 abstract 抽象类分为纯抽象类和普通抽像类,纯抽象类里面全部都是抽象方法,普通抽象类里面既有普通方法,也有抽像方法 抽象类不能实现,只能继承,子类继承抽象父类那么就必须重新父类里面所有的抽象方法,不重写将报错, 抽象类不能够new对象,如果你真想要要new对象的话那也只能通过类部类的方法new出一个对象,然后重写她里面的放方法 下图是正常继承抽象类,然后重写方法 接口的介...

weixin_42334543的博客 253

java接口和抽象类的区别

接口是like关系,指b像a的问题;抽象类是is关系,指b是a的关系。当然他们内部还有很多不一样。 抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的。**如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它**,那么这样的类我们称它为抽象类。 抽象类是**用来捕捉子类的通用特性的 。它不能被实例化**,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。

栋幺栋幺-的博客 783

JAVA抽象类和接口的简单理解

JAVA 关于接口和抽象类 抽象类 总的来说抽象类和一般的类的区别只有抽象方法这一个区别,其他的区别都是由于抽象方法的存在而产生的 抽象类是一类特殊的类,它必须用abstract关键词修饰,如 // 定义了一个抽象类 abstract class CatAnimals{ private String name = "LittleCat"; // 普通的成员变量 CatAnimals(){ // 抽象类可以由构造方法 na

qq_46181804的博客 148

接口与抽象类的区别和联系

接口 1、因为java不支持多重继承,所以有了接口,一个类只能继承一个父类,但是可以实现多个接口,同时接口本身也可以继承多个接口。 2、接口里面的成员变量默认是public static final类型的。必须被显示的初始化。 3、接口里面的方法默认都是public abstract类型的。隐式声明。 4、接口没有构造方法,不能被实例化。 5、接口不能实现另外的一个接口,但是可以继承多个接口。 6...

wh柒八九的博客 346

抽象类和接口区别

一、抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以称之为抽象类。 1.抽象方法:使用abstract修饰且没有方法体的方法。 特点: ① 抽象方法没有方法体,交给子类实现 ② 抽象方法修饰符不能是private final static ③ 抽象方法必须定义在抽象...

woailuo23的博客 853

抽象类和接口的区别

一、修饰方法 1.构造方法 抽象类可以有构造方法,接口不可有 2.普通方法 抽象类可以有普通方法,接口中的方法必须是抽象的 3.静态方法 抽象类可以有静态方法,接口不可以有静态方法 二、修饰属性 抽象类中可以有普通变量,接口不可有 抽象类中和接口中都可以有静态变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型 三、 一个类可以实现多个...

joicy1994的博客 197
上一篇: java1.8 新特性 - 流式处理
下一篇: linux redis单机安装总结
zzqcsdn123
博客等级 码龄12年 26粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值