当前位置: 首页 > news >正文

JAVA: 抽象类和接口

        Java中可以可以定义不含方法体的方法,方法的方法体由其所在类的子类根据实际需求去实现,这样的方法称为抽象方法(Abstract Method),包含抽象方法的类必须是抽象类(Abstract Class)。

抽象方法和抽象类

1.1抽象方法 

Java中提供了 abstract 关键字 ,表示抽象的意思,用abstract修饰的方法修饰的方法,称为抽象方法。抽象方法不是一个完整的方法,只有方法的声明,没有方法体。

抽象方法没有方法体,具体的实现由子类完成,且抽象方法必须定义在抽象类或者接口里面

1.2 抽象类

用abstract修饰的类 ,称为抽象类,抽象类可以不包含任何抽象方法。定义抽象类和抽象方法的语法格式如下:

[修饰符] abstract class 类名{[修饰符] abstract 方法返回值类型 方法名 ([参数列表])//其他成员
}

比如:

abstract class Graph{publicc abstract void getArea();
}

         使用抽象类时需要注意,抽象类不能被实例化,即不能用new关键字创建对象。这是因为抽象类中可包含抽象方法,抽象方法只有 声明没有方法体,不能被调用。但是,我们可以通过子类继承抽象类去实现抽象方法

        子类定义时实现了抽象方法,因此,在实例化子类对象后,子类可以调用子类中实现的抽象方法。

        需要注意的是,具体子类必须实现抽象父类中的所有抽象方法,否则子类必须声明为抽象类,不然子类会报错。

        抽象类时不能实例化的,即使实例化了,去调用抽象方法,也没有方法体。虽然一些抽象方法中会存在普通方法(子类可以进行调用),但是包含抽象方法的类,必须为抽象类。抽象类中的构造方法不能全部定义为私有的,否则就不能创建子类的对象了(子类构造方法必须调用父类构造方法创建对象)。抽象类并不是一个完整的类,它必须有子类继承才有意义,功能才得以实现。

        抽象类中可以不存在抽象方法,以防止外界创造 对象,因此有一些工具类中虽然没有抽象方法,却使用了abstract修饰。

 2.接口

        生活中许多硬件接口,通常用于与其他硬件设备相连接。编程中有软件接口,指的是 一种程序代码,可被看作一种特殊的类,也属于引用类型,它表示一种规范,是全局常量和公共抽象方法的集合,每个接口都可以被编译成独立的字节码文件。

        接口只定义了类应当遵守的规范,去并不关心这些类的内部数据和其功能的实现细节。站在程序的角度上说,接口只规定了类中必须提供的方法,从而分离了规范和实现,增强了系统的可拓展性和维护性。接口和实现类体现多态。

3.1 接口实现和声明

        接口是抽象类的延伸,可以将它看成纯粹的抽象类接口中的所有方法都是抽象方法。Java提供了interface关键字,用于声明接口,语法格式如下:

interface 接口 [extends 父接口列表]{[public] [static] [final] 常量;[public] [abstract] 方法;
}

        接口名用于指定接口名称,它必须是合法的Java标识符,一般要求首字母大写;接口之间也存在继承关系,使用extends关键字指定要定义的接口继承于哪个父接口;接口会默认为常量添加“public static final”修饰符,为方法添加“public abstract”修饰符。因此,修饰符可以省略不写。

         接口不能实例化,即不能使用new创建接口的实现类。如果需要调用接口中的非静态方法,只需要通过接口实现类的对象来调用。Java提供implements 关键字,用于实现接口一个类可以在继承另一个类的同时实现多个接口,语法格式如下:

class 类名 [extends 父类名] implements 接口列表{属性和方法;
}

         接口列表中多个接口之间使用英文逗号(,)分隔。

3.2抽象类和接口的关系

         抽象类与接口是Java语言对于抽象类定义进行支持的两种机制,二者非常相似,但抽象类是对根源的抽象,而接口是对动作和规范的抽象,二者的区别可区别可以归纳为5点。

        • 子类只能继承一个抽象类,但是可以实现多个接口。

        • 接口中的方法都是抽象方法,而抽象类中可以存在非抽象方法。

        • 抽象类中的变量可以是任意数据类型,接口中的成员变量只能是静态常量。

        • 抽象类中可以定义静态方法和静态代码块等,接口中可以定义静态方法,但是没有静态代码块。

        • 接口中没有构造方法,抽象类有构造方法。

        总体来说,抽象类和接口都用于为对象定义共同的行为,二者在很大程度上是可以互相替换的,但是由于抽象类只允许单继承,所以当二者都可以使用时,优先考虑接口只有当需要定义子类行为并为子类提供共性功能时,才考虑用抽象类

4.内部类 

        在Java中,类中除了可以定义成员变量与成员方法,还可以定义类,这样的类称为内部类,内部类所在的类称为外部类。根据内部类的位置、修饰符和定义的方式,可以分为成员内部类、静态内部类、方法内部类以及匿名内部类4种。

        内部类有3个共性。

        • 内部类与外部类经Java编译器编译后生成的两个类是独立的。

        • 内部类是外部类的一个成员,因此能访问外部类的任何成员(包括私有成员),但是外部类不能直接访问内部类成员。

        • 内部类可为静态,可用protect和private修饰,而外部类只能用public修饰,且具有默认的访问权限。

4.1成员内部类

        成员内部类是指类作为外部类的一个成员能直接访问外部类的所有成员,但是外部类中访问内部类,则需要在外部类中创建内部类的对象,使用内部类的对象来访问内部类的成员。同时,若要在外部类外访问内部类,则需要通过外部类对象去创建内部类对象,在外部类外创建一个内部类对象的格式如下:

外部类名.内部类名 引用变量名 =new 外部类名().new 内部类名();

         另外,需要注意的是,成员内部类不能定义静态变量、静态方法和静态内部类。这是因为当外部类被加载时,内部类是非静态的,那么Java编译器不会初始化内部类中的静态成员,这就与Java编译原则相悖。

4.2 内部静态类

        如果不需要外部类对象与内部类对象之间有联系,那么可以将内部类声明为static用static关键字修饰的内部类称静态内部类。静态内部类可以有实例成员和静态成员,它可以直接访问外部类的静态成员,但如果想访问外部类的实例成员,就必须通过外部类的对象去访问。另外,如果外部类访问静态内部类成员,则不需要创建外部类对象,只需要创建内部类对象即可。创建内部类对象语法如下:

外部类名.内部类名 引用变量名 =new 外部类名.内部类名();

         若要访问内部类的静态成员,则无需创建外部类和静态内部类对象,可通过“外部类名 . 内部类名 . 静态成员” 的形式访问。若要访问内部类的实例成员,则需要创建静态内部类对象,通过“new 外部类名 . 内部类名()”形式可直接创建内部类对象。

4.3 方法内部类

        方法内部类又称为局部内部类是指在成员方法中定义的类,他与局部变量类似,作用域为它所在代码块,因此它只能在定义它的方法内的实例化,不可以在此方法外实例化。

4.4匿名内部类 

        匿名内部类就是没有名称的内部类,它的特点是只能使用一次,不能重复使用,及创建匿名内部类的实例对象后,这个匿名内部类的定义会立即消失。匿名内部类的所有实现代码都需要在大括号之间编写,最常用的创建匿名内部类的方式是创建某个接口或者抽象类的对象。

        创建匿名内部类的格式如下:

new ClassName{//匿名内部类的实体
}

        需要注意的是,匿名内部类是不能加访问权限修饰符的,而且被new的匿名内部类必须 是先定义的。

相关文章:

JAVA: 抽象类和接口

Java中可以可以定义不含方法体的方法,方法的方法体由其所在类的子类根据实际需求去实现,这样的方法称为抽象方法(Abstract Method),包含抽象方法的类必须是抽象类(Abstract Class)。 抽象方法和…...

风景的短视频一分钟:成都科成博通文化传媒公司

风景的短视频一分钟:时光凝固的画卷 在快节奏的现代生活中,我们常常被繁忙和琐碎所困扰,渴望在喧嚣中找到一丝宁静与美好。而风景的短视频,正是这样一份能够让我们在短时间内沉浸于自然之美的奇妙礼物。成都科成博通文化传媒公司…...

力扣--双指针15.三数之和

详细思路 排序数组:首先对数组 nums 进行排序,目的是为了方便后续使用双指针查找和避免重复结果。遍历数组:使用一个 for 循环从头遍历到倒数第三个元素。i 表示当前固定的元素。 跳过重复元素:如果当前元素 nums[i] 与前一个元素…...

C++ A (1020) : 幂运算

文章目录 一、题目描述二、参考代码 一、题目描述 二、参考代码 #include<bits/stdc.h> using namespace std; typedef long long ll;void qq(ll a, ll b, ll m) {if (a 0) cout << 0 << endl;;ll out 1;a % m;while (b > 0){if (b & 1)//奇数的最…...

GVM: Golang多版本管理利器

本文介绍了 Go Version Manager 的功能和使用方法&#xff0c;介绍了如何通过 GVM 在系统上安装和管理多个 Go 语言版本。原文: GVM: Go Version Manager, for Golang manage multiple versions Go 版本管理器&#xff08;GVM&#xff0c;Go Version Manager&#xff09;是一款…...

AlmaLinux9安装zabbix6.4

文章目录 [toc]一、配置源1&#xff09;查看系统2&#xff09;配置源 二、安装zabbix三、安装数据库1&#xff09;卸载mariadb2&#xff09;安装MySQL3&#xff09;配置开启自启动4&#xff09;MySQL设置root密码 四、导入数据五、配置zabbix六、参考地址六、参考地址 一、配置…...

基于翔云C#语言的身份证实名认证接口开发示例

现如今&#xff0c;安全与便捷成为了互联网服务的两大关键词。为了进一步提升用户体验并加强网络安全管理&#xff0c;国内多家主流App近日宣布完成一项重要功能升级——集成身份证实名认证系接口。这一举措标志着用户在进行App注册时&#xff0c;将享受到更加高效、安全的身份…...

MySQL中的redo log 和 undo log

undo log和redo log 先引入两个概念&#xff1a; 当我们做了一些操作 (update/delete/insert)&#xff0c;提交事务后要操作MySql中的数据。 为了能够提升性能&#xff0c;引入了两块区域&#xff1a;内存结构和磁盘结构。 磁盘结构&#xff1a; 主要存储的就是数据页&#x…...

net/http与gin框架的关系分析

要想学好 gin 框架&#xff0c;首先要学习 net/http 服务&#xff0c;而二者的关系又是重中之重。 本文所要做的任务就是将二者“连接” 起来&#xff0c;让读者掌握其中之精髓。 一、Golang HTTP 标准库示例 使用 golang 启动 http 服务非常简单&#xff0c;就是一个标准的 C…...

Docker的安装、启动和配置镜像加速

前言&#xff1a; Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 而企业部署一般都是采用Linux操作系统&#xff0c;而…...

Linux系统下+jmeter分布式压测

一.配置jdk&#xff08;Linux机都需配置同一个版本&#xff09; 下载Linux系统的jdk&#xff0c;下载地址&#xff1a;https://repo.huaweicloud.com/java/jdk/ 下载后的jdk文件上传到 /opt目录下 进入opt目录&#xff0c;查看jdk文件 cd /opt ll 1.解压文件 tar xzvf jd…...

点点点还有没有做下去的必要

大家好&#xff0c;我是洋子&#xff0c;最近工作特别忙&#xff0c;好久没更文章了 因为组织架构调整&#xff0c;原先的组长调离我所在已经3年多的业务线&#xff0c;我就承担起组长的角色了&#xff0c;除了日常跟进需求测试&#xff0c;还跟RD、跨业务线负责人开会&#x…...

uni-app增加home图标,实现回到功能主页(九)

最近在优化一个uni-app项目,项目中有许多设备需要点检,点检完成后可以继续点检;最后导致页面跳转用的是 uni.navigateTo({ url:"/pages/dianjian/dianjian/dianjianInfo?datatype="+this.datatype }); 众所周知,这个会将页面推入堆栈中,结合…...

Android关闭硬件加速对PorterDuffXfermode的影响

Android关闭硬件加速对PorterDuffXfermode的影响 跑的版本minSdk33 编译SDK34 import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Port…...

排序-插入排序与选择排序

插入排序 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 打扑克牌整理手牌用的就是插入排序的思想 代码实现 void InsertSort(int* a, int n) { assert(a); …...

【前端每日基础】day33——响应式布局

响应式布局是一种网页设计的方法&#xff0c;它可以使网站在不同的设备上&#xff08;如桌面电脑、平板电脑、手机等&#xff09;以及不同的屏幕尺寸上呈现出最佳的显示效果。响应式布局的目标是使用户在任何设备上都能够方便地访问和浏览网站&#xff0c;而不需要使用不同版本…...

leetcode 2981.找出出现至少三次的最长子特殊字符串(纯哈希表暴力)

leetcode 2981.找出出现至少三次的最长子特殊字符串&#xff08;传送门&#xff09; class Solution { public:int maximumLength(string s) {int hash[30][52] { 0 },len 1,maxn0;char last A;for (char ch : s) {if (ch last) len;else len 1;for (int i len; i > …...

集成算法实验与分析(软投票与硬投票)

概述 目的&#xff1a;让机器学习效果更好&#xff0c;单个不行&#xff0c;集成多个 集成算法 Bagging&#xff1a;训练多个分类器取平均 f ( x ) 1 / M ∑ m 1 M f m ( x ) f(x)1/M\sum^M_{m1}{f_m(x)} f(x)1/M∑m1M​fm​(x) Boosting&#xff1a;从弱学习器开始加强&am…...

网络数据库后端框架相关面试题

面试是工作的第一步&#xff0c;面试中面试官所提出的问题千奇百怪&#xff0c;其中关于网络数据库后端框架面试题汇总如下&#xff1a; 1&#xff0c;关系型数据库和非关系型数据库的区别 关系型数据库主要有 MYsql Iracle SQLSever等 相对于非关系型数据库的优势为查询效率…...

模拟集成电路(6)----单级放大器(共源共栅级 Cascode Stage)

模拟集成电路(6)----单级放大器&#xff08;共源共栅级 Cascode Stage&#xff09; 大信号分析 对M1 V x ≥ V i n − V T H 1 V x V B − V G S 2 V B ≥ V i n − V T H 1 V G S 2 V_{x}\geq V_{in}-V_{TH1}\quad V_{x}V_{B}-V_{GS2}\\V_{B}\geq V_{in}-V_{TH1}V_{GS2} Vx…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...