Java面试之抽象类和接口

Java的一个重要特性就是抽象,抽象是指将具体的事物抽象成更一般化、更抽象化的概念或模型。在Java中,抽象可以通过抽象类和接口来实现,它们让你能够定义一些方法但不提供具体实现,从而让子类去实现具体细节。

一、抽象类:

1.1、概念:

Java中的抽象类是一种特殊的类,它不能被实例化,只能被用作其他类的基类。抽象类通常用于定义一些通用的属性和方法,但是它本身并不完整,而是作为其他类的模板或者基础。抽象类中可以包含抽象方法,这些方法只有声明而没有实现,子类必须实现这些抽象方法才能具体化抽象类。在Java中,使用关键字abstract来声明一个抽象类。抽象类可以有普通的方法实现,也可以包含抽象方法。如果一个类包含了一个或多个抽象方法,那么这个类必须被声明为抽象类。

1.2、代码实例:

abstract class Shape {double area(); // 抽象方法,子类必须实现void draw() {System.out.println("Drawing a shape");}
}class Circle extends Shape {double radius;@Overridedouble area() {return Math.PI * radius * radius;}
}class Rectangle extends Shape {double length;double width;@Overridedouble area() {return length * width;}
}

Shape是一个抽象类,它定义了一个抽象方法area(),而CircleRectangleShape的子类,它们都实现了area()方法。 

二、接口:

2.1、概念:

在Java中,接口(Interface)是一种抽象类型,它定义了一组方法的规范,但是不提供这些方法的具体实现。接口可以看作是一种约定,规定了类应该具备的行为,但不关心这些行为的具体实现方式。类通过实现(implement)接口来承诺实现接口中定义的所有方法。Java中的接口使用关键字interface来声明,接口中的方法默认都是抽象的,不需要使用abstract关键字进行标识。接口用于定义一种行为或能力,但并不是所有类都必须实现这种行为或能力。因此,通过接口,我们可以在需要的时候为类添加额外的行为,而不是强制所有类都具备这种行为。

2.2、代码实例:

interface Animal {void eat(); // 抽象方法void sleep(); // 抽象方法
}class Dog implements Animal {@Overridepublic void eat() {System.out.println("Dog is eating");}@Overridepublic void sleep() {System.out.println("Dog is sleeping");}
}

Animal是一个接口,定义了eat()sleep()两个抽象方法。Dog类通过implements关键字实现了Animal接口,并提供了eat()sleep()方法的具体实现。

三、抽象类和接口的区别:

1.1、抽象类可以有实现好的具体函数,但接口不可以,必须全部是抽象方法。

1.2、抽象类可以有成员变量,但接口只能有静态常量(static final修饰)。

1.3、由于Java的单继承制,一个类(普通)只能继承一个抽象类;但可以实现多个接口,从而具备多个接口所定义的行为。这种多重继承的方式有助于解决Java单继承的限制,提高了代码的灵活性和复用性。

1.4、关键字不同:抽象类abstract,接口interface。

1.5、抽象类可以有构造方法,但是接口没有构造方法。

1.6、抽象类通常用于具有一些共同特征的类,而接口用于定义类之间的契约,即类应该如何行为。

1.7、抽象类就像是一种带有一些具体实现的蓝图,而接口更像是一份规范,告诉类应该有哪些功能和行为。

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

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

相关文章

springboot3 集成spring-authorization-server (一 基础篇)

官方文档 Spring Authorization Server 环境介绍 java&#xff1a;17 SpringBoot&#xff1a;3.2.0 SpringCloud&#xff1a;2023.0.0 引入maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

识别AI论文生成内容,降低论文高AI率

AI写作工具能帮我们在短时间内高效生成一篇毕业论文、开通报告、文献综述、任务书、调研报告、期刊论文、课程论文等等&#xff0c;导致许多人开始使用AI写作工具作为撰写学术论文的辅助手段。而学术界为了杜绝此行为&#xff0c;开始使用AIGC检测系统来判断文章是由AI生成还是…

解锁商业AI,赋能新质生产力发展——思爱普中国峰会探展全纪录

ITValue 钛媒体独家探秘思爱普中国峰会&#xff0c;带你深刻感受SAP助力企业利用以商业AI为代表的数字化技术&#xff0c;实现质的飞跃&#xff0c;通过全数据、全球化、全绿色赋能新型中国企业发展新质生产力。 首发&#xff5c;钛媒体APP ITValue 5月10日&#xff0c;一年一度…

基于NTP服务器获取网络时间的实现

文章目录 1 NTP1.1 简介1.2 包结构1.3 UNIX 时间戳和NTP时间戳 2 代码实现2.1 实现步骤2.2 完整代码 3 结果 在某些场景下&#xff0c;单片机需要通过网络获取准确的时间进行数据同步&#xff0c;例如日志记录、定时任务等。然而&#xff0c;单片机本身无法直接获得准确的标准时…

Vue的学习 —— <vue指令>

目录 前言 正文 内容渲染指令 内容渲染指令的使用方法 v-text v-html 属性绑定指令 双向数据绑定指令 事件绑定指令 条件渲染指令 循环列表渲染指令 侦听器 前言 在完成Vue开发环境的搭建后&#xff0c;若想将Vue应用于实际项目&#xff0c;首要任务是学习Vue的基…

ORA-00932: inconsistent datatypes: expected - got CLOB的分析解决方案

最近在项目中遇到查询数据时报ORA-00932: inconsistent datatypes: expected - got CLOB错误&#xff0c;这个错误很明显是由于查询时类型的不匹配造成的。 问题分析&#xff1a; 一、检查你的查询的实体的类型是否于数据库的保持一致&#xff0c;如果不一致&#xff0c;那么需…

333_C++_编写一个go函数每次从文件中读取固定大小数据,且go作为回调,传递给其他函数中,多次调用,完成逐块传输数据

(core工程文件) tick_transfer_all_t类是一个用于异步传输数据的辅助类,它在某个异步操作完成后将_tick的值设置为0,并返回传输的结果 namespace hl {namespace http{namespace __detail{class tick_transfer_all_t{boost::shared_ptr<unsigned long long> _tick

MySQL 查询库 和 表 占用空间大小的 语句

查看mysql 数据库的大小 SELECT table_schema AS 数据库名称, ROUND(SUM(data_length index_length) / 1024 / 1024, 2) AS 数据库大小(MB) FROM information_schema.tables GROUP BY table_schema;查询数据库中表的 数据量&#xff08;这个方法 有缓存延迟&#xff0c;只能用…

[力扣题解] 96. 不同的二叉搜索树

题目&#xff1a;96. 不同的二叉搜索树 思路 动态规划 f[i]&#xff1a;有i个结点有多少种二叉搜索树 状态转移方程&#xff1a; 以n3为例&#xff1a; 以1为头节点&#xff0c;左子树有0个结点&#xff0c;右子树有2个结点&#xff1b; 以2为头节点&#xff0c;左子树有1个…

安科瑞AIM-D100-ES光伏储能系统直流绝缘监测仪

概述 AIM-D100-ES 型直流绝缘监测仪主要用于在线监测直流不接地系统正负极对地绝缘电阻&#xff0c;当绝缘电阻低于设定值时&#xff0c;能发出预警和报警信号。 产品可测 100-1500V 的直流系统&#xff0c;可应用于储能直流系统、电动汽车充电装置、UPS 供电系统、光伏直流系…

超级好用的C++实用库之日志类

&#x1f4a1; 需要该C实用库源码的大佬们&#xff0c;可搜索微信公众号“希望睿智”。添加关注后&#xff0c;输入消息“超级好用的C实用库”&#xff0c;即可获得源码的下载链接。 概述 日志类主要用于在程序运行过程中记录信息、错误、警告以及其他需要跟踪的数据&#xff0…

std::ref和std::cref的使用和原理分析

目录 1.用法 2.std::reference_wrapper介绍 3.std::ref原理分析 4.std::cref原理分析 5.总结 1.用法 它的定义如下&#xff1a; std::ref&#xff1a;用于包装按引用传递的值。 std::cref&#xff1a;用户包装按const引用传递的值。 C本身就有引用&#xff08;&&#…

学习中的小疑问|头结点是什么?

头结点 在数据结构中&#xff0c;单链表是一种常见的线性数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含两个部分&#xff1a;存储数据的数据域和指向下一个节点的指针域。单链表的头结点是指链表的第一个节点&#xff0c;它通常用于标识链表的开始位置。 …

面试题:调整数字顺序,使奇数位于偶数前面

题目&#xff1a; 输入一个整数数组&#xff0c;实现一个函数&#xff0c;来调整该数组中数字的顺序 使得所有奇数位于数组的前半部分&#xff0c;所有偶数位于数组的后半部分 算法1&#xff1a; 利用快速排序的一次划分思想&#xff0c;从2端往中间遍历 时间复杂度&#x…

C++ | Leetcode C++题解之第88题合并两个有序数组

题目&#xff1a; 题解&#xff1a; class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 m - 1, p2 n - 1;int tail m n - 1;int cur;while (p1 > 0 || p2 > 0) {if (p1 -1) {cur nums2[p2-…

Alist + RaiDrive-Nas挂载云盘(Quark)

Alist RaiDrive-Nas挂载云盘(Quark) Alist download Alist document RaiDriver download — https://www.raidrive.com/ nssm download nssm document nssm specification 配置 Alist 下载适合的Alist版本后&#xff0c;启动服务&#xff1b; 需使用命令符。 在完成解…

数字水印 | Python 基于离散小波变换 DWT 的图像水印嵌入(上)

&#x1f34d;原文&#xff1a; 基于 dwt (离散小波变换) 实现彩色图像水印嵌入部分_1.0 &#x1f34d;写在前面&#xff1a; 本文在原文的基础上进行了代码补全。 正文 本文的内容主要为&#xff1a;水印图像经过 A r n o l d \mathsf{Arnold} Arnold 置乱算法后&#xff0…

vue+springboot用户注销功能

vue文件前端 <el-button type"warning" plain click"handleDeletion">注 销</el-button> // 注销 const handleDeletion (userName) > {ElMessageBox.confirm(注销该用户所有信息后无法恢复&#xff0c;您确认注销吗?, 注销确认, { type…

基于halcon的锯齿检测

锯齿检测是机器视觉中的一项任务&#xff0c;它涉及到检测图像中类似锯齿的边缘或模式。在 Halcon 中&#xff0c;这通常涉及到图像处理和分析技术&#xff0c;如边缘检测、阈值处理、形态学操作和轮廓分析。以下是一个基于 Halcon 的锯齿检测的概述&#xff0c;以及一个简单的…