当前位置: 首页 > 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…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

【Linux】Linux 系统默认的目录及作用说明

博主介绍&#xff1a;✌全网粉丝23W&#xff0c;CSDN博客专家、Java领域优质创作者&#xff0c;掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围&#xff1a;SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...