Java--抽象类和接口的区别

news2024/11/14 8:59:51

今天是22年最后一天了, 写篇博客记录一下吧, 这一年发生了很多事情, 也学到了很多知识, 后面要继续加油啊, 大家也要加油啊, 米娜桑. 

目录

概述

区别

1. 定义关键字不同

2. 继承或实现的关键字不同

3. 子类扩展的数量不同

4. 属性访问控制符不同

5. 方法控制符不同

6. 方法实现不同

7. 静态代码块使用不同


概述

接口和抽象类是 Java 面向对象设计的两个基础机制.

接口是对行为的抽象, 它是抽象方法的集合, 利用接口可以达到 API 定义和实现分离的目的. 接口不能实例化; 不能包含任何非常量成员, 任何 field 都是隐含着 public static final 的意义; 同时, 没有非静态方法实现, 也就是说要么是抽象方法, 要么是静态方法. Java 标准类库中, 定义了非常多的接口, 比如 java.util.List.

抽象类是不能实例化的类, abstract 关键字修饰 class, 其目的主要是代码重用. 除了不能实例化,  形式上和一般的 Java 类并没有太大区别, 可以有一个或者多个抽象方法, 也可以没有抽象方法. 抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量, 然后通过继承的方式达到代码复用的目的. Java 标准库中, 比如 collection 框架, 很多通用部分就被抽取成为抽象类, 例如 java.util.AbstractList.

Java 类实现 interface 使用 implements 关键字, 继承 abstract class 则是使 用 extends 关键词,我们可以参考 Java 标准库中的 ArrayList.

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
    //...
}

区别

接口和抽象类的区别主要体现在以下 7 个方面.

1. 定义关键字不同

接口使用关键字 interface 来定义.

抽象类使用关键字 abstract 来定义.

2. 继承或实现的关键字不同

接口使用 implements 关键字定义其具体实现.

抽象类使用 extends 关键字实现继承.

3. 子类扩展的数量不同

接口的实现类可以有多个,如下图所示:

而抽象类的子类, 只能继承一个抽象类, 如下图所示, 继承多个抽象类就会报错:

 

 在 Java 语言中, 一个类只能继承一个父类(单继承), 但可以实现多个接口.

4. 属性访问控制符不同

接口中属性的访问控制符只能是 public, 如下图所示:

 接口中的属性默认是 public static final 修饰的

抽象类中的属性访问控制符无限制, 可为任意控制符, 如下图所示:

5. 方法控制符不同

接口中方法的默认控制符是 public, 并且不能定义为其他控制符, 如下图所示:

抽象类中的方法控制符无限制, 其中抽象方法不能使用 private 修饰, 如下所示: 

6. 方法实现不同

接口中普通方法不能有具体的方法实现,在 JDK 8 之后 static 和 default 方法必须有方法实现,如下所示:

从上述结果可以看出: static 或 default 方法如果没有方法实现就会报错, 而普通方法如果有方法实现就会报错.

抽象类中普通方法可以有方法实现, 抽象方法不能有方法实现, 如下所示:

 

从上述结果可以看出: 抽象类中的普通方法如果没有方法实现就会报错, 而抽象方法如果有方法实现则会报错.

7. 静态代码块使用不同

 接口中不能使用静态代码块, 如下所示:

抽象类中可以使用静态代码块, 如下代码所示:

 

 

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

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

相关文章

python互联网程序设计GUI程序设计和网络程序设计(人机互动聊天软件)

1&#xff0e;项目意义 1、了解网络的结构&#xff1b; 2、了解网络传输协议&#xff1b; 3、掌握基本的网络编程方法。 2&#xff0e;总体设计 使用 TCP 协议实现人机聊天互动&#xff0c;程序具有服务端和客户端&#xff1a; &#xff08;1&#xff09;必备功能&#xff1…

Java财务在线咨询网站系统财务咨询网

简介 财务咨询网站&#xff0c;可以咨询公司代办&#xff0c;代理记账等一系列的财务问题的资讯服务网站 演示视频 https://www.bilibili.com/video/BV1T54y1H7Ar/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 角色 管理员客服注册用户游客 技术…

Spring之DI入门案例

目录 一&#xff1a;DI入门案例实现思路分析 1.要想实现依赖注入&#xff0c;必须要基于 IOC 管理 Bean 2.Service 中使用 new 形式创建的 Dao 对象是否保留 ? 3.Service 中需要的 Dao 对象如何进入到 Service 中 ? 4.Service 与 Dao 间的关系如何描述 ? 二&#xff1…

(Qt) cmake编译Qt项目

文章目录前言环境cmake基础预备的项目代码文件资源路径demo.promain.cppres.qrcmywidget.cppmywidget.hmywidget.ui运行效果CMake文件资源路径CMakeLists.txt生成与构建END前言 通常我们在编写qt的时候都是在Qt creator中。而如何在VS Code中编写qt就是本文需要解决的问题 环…

顺序表 —— 初始化、销毁、打印、增加、删除、查找、修改

1.何为线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直…

zotero导出pdf

今天老师给我改论文的时候布置了一个任务&#xff0c;让我把所有论文的pdf按格式打包发给她。可是之前我用zotero的时候都是在线保存的&#xff0c;有些是没有pdf的&#xff0c;怎么办&#xff1f;而且就算有pdf&#xff0c;他们的命名格式也五花八门&#xff0c;难道一个个手改…

kafka 消息日志原理 指定偏移量消费 指定时间戳消费

Kafka 日志详解 Apache Kafka日志存储在物理磁盘上各种数据的集合&#xff0c;日志按照topic分区进行文件组织&#xff0c;每一个分区日志由一个或者多个文件组成。生产者发送的消息被顺序追加到日志文件的末尾。 如上图所述&#xff0c;Kafka主题被划分为3个分区。在Kafka中&…

vscode使用跳板机(密钥)进入内网并连接内网中其它机器(密码)

经过简单测试 1、不能像xshell一样选择服务器的密钥登陆&#xff0c;只能通过将本机的公钥传到服务器上 2、不能使用本地socket5做代理登录 3、不能使用系统代理登录 一、使用密钥连接到跳板机 1、内网穿透 2、将本机公钥上传到服务器上 1&#xff09;建立密钥对 无论是win…

redis集群 mac安装

1.安装redis mac环境用brew install安装 brew install redis 安装好后默认配置启动单点服务 redis-server 注&#xff1a;brew默认程序安装在/usr/local/Cellar目录下 /usr/local/Cellar/redis 默认配置文件在 /usr/local/etc/redis.conf 2.创建配置文件 准备创建6个节…

谣言检测数据集

1 PHEME-R 这是一个在PHEME FP7项目的新闻学用例中收集和注释的数据集。这些谣言与9个不同的突发新闻相关。它是为分析社交媒体谣言而创建的&#xff0c;包含由谣言推文发起的推特对话&#xff1b;对话包括对这些谣言推文的回应推文。这些推文已经被注解为支持度、确定性和证…

VS2012安装教程

我要学只有我们两个人懂得C语言。 安装包&#xff1a;https://pan.baidu.com/s/1YR7Xk9Zlv7zQWCsERdVgIQ [提取码]&#xff1a;stvi 1、右键以管理员身份运行 “vs_ultimate.exe” 2、编辑软件安装位置&#xff0c;然后点击同意许可&#xff0c;之后点下一步即可&#xff01; 3…

mongoDB聚合查询

管道 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。 聚合管道操作 可参考菜鸟文档&#xff1a;菜鸟文档 命令 功能描述 $project指定输出…

shell第四天作业——流程控制之循环

题目 一、for创建20个用户&#xff0c;用户前缀由用户输入&#xff0c;用户初始密码由用户输入。 二、for循环ping测试指定网段的主机&#xff0c;网段由用户输入。 三、使用for/while实现批量主机root密码的修改 一、for创建20个用户&#xff0c;用户前缀由用户输入&#x…

2022年已然要结束了,一起来分享下你的故事吧!2023年的接力棒已经递到手里,千言万语不如一句Fighting!

【系列专栏】&#xff1a;博主结合工作实践输出的&#xff0c;解决实际问题的专栏&#xff0c;朋友们看过来&#xff01; 《QT开发实战》 《嵌入式通用开发实战》 《从0到1学习嵌入式Linux开发》 《Android开发实战》 《实用硬件方案设计》 长期持续带来更多案例与技术文章分享…

c++语法欠缺地方

sizeof是用来计算变量占多大内存的&#xff0c;单位是字节&#xff08;byte&#xff09;&#xff1b;sizeof 后面跟类型时&#xff0c;必须加上括号&#xff0c;例如sizeof(double);后面跟变量可以不用加括号&#xff0c;例如&#xff1a;sizeof d%d是以十进制形式输出有符号整…

CDP集群卸载过程

CDP集群卸载过程 1. 登录到Cloudera Manager&#xff0c;并停止整个集群服务。 2. 停用并移除所有Parcel 3. “停用”CDH7的Parcel。 4. 从主机删除”CDH6的Parcel 5. 删除集群 6. 登录server机器&#xff0c;停止CM Server服务 systemctl stop cloudera-scm-server 7. 移除…

如何实现高性能点赞(三)

数据库设计 数据库表中至少要包含三个字段&#xff1a;被点赞用户id&#xff0c;点赞用户id&#xff0c;点赞状态。再加上主键id&#xff0c;创建时间&#xff0c;修改时间就行了。 建表语句 对应的对象 UserLike 数据库操作 操作数据库同样封装在接口中 LikedService L…

【2.2】服务拆分--服务远程调用

服务拆分--服务远程调用1 案例--根据订单id查询订单功能2 远程调用方式分析2.1 注册RestTemplate2.2 发http请求3 总结1 案例–根据订单id查询订单功能 需求&#xff1a;根据订单id查询订单的同时&#xff0c;把订单所属的用户信息一起返回。 由上一节的测试结果可以看出&…

opencv-python常用函数解析及参数介绍(五)——腐蚀与膨胀

腐蚀与膨胀前言膨胀腐蚀开运算与闭运算礼帽与黑帽运用膨胀和腐蚀获得图像轮廓前言 有些时候图片上会有一些划痕或者污渍&#xff0c;会影响图片的质量&#xff0c;假设我有一张写有“艾醒”的图片&#xff0c;但是有花花绿绿的划痕和污渍&#xff0c;这时我们就可以运用腐蚀与…

五、Web自动化测试

Web自动化测试5.1 Selenium Web 自动化5.1.1 Selenium 和 Robot Framework SeleniumLibrary 库介绍安装 robotframework-seleniumlibrary导入 SeleniumLibrary5.1.2 Open Browser 和 Close Browser5.1.3 Input Text5.1.4 Click Button5.1.5 Click Element5.1.6 Click Link5.1.7…