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的匿名内部类必须 是先定义的。

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

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

相关文章

【架构设计】Java如何利用AOP实现幂等操作,防止客户端重复操作

1实现方案详解 在Java中,使用AOP(面向切面编程)来实现幂等操作是一个常见的做法,特别是当你想在不修改业务代码的情况下添加一些横切关注点(如日志、事务管理、安全性等)时。幂等操作指的是无论执行多少次,结果都是相同的操作。 为了利用AOP实现幂等操作以防止客户端重…

基于STM32的水库预警系统的Proteus仿真

文章目录 一、水库预警系统1.题目要求2.思路2.1 OLED显示汉字2.2 水质传感器等等2.3 步进电机2.4 驱动水泵 3.仿真图3.1 未仿真时3.2 开始仿真,OLED开始显示3.3 提高水位,开启阀门和预警3.4 通过按键增大水位阈值,取消报警 4.仿真程序4.1 程序…

轻松拿捏C语言——【文件操作】

🥰欢迎关注 轻松拿捏C语言系列,来和 小哇 一起进步!✊ 🎉创作不易,请多多支持🎉 🌈感谢大家的阅读、点赞、收藏和关注💕 🌹如有问题,欢迎指正 目录 &#x1f…

关于模拟信道和数字信道根本区别的探讨

在学习过程中,了解到模拟信号、数字信号是什么,以及模拟信道只能传输模拟信号,数字信道只能传输数字信号,模拟信道要传输数字信号,需要经过调制解调器将数字信号调制成模拟信号再传输。也了解到,电话线是属…

谨以此文章记录我的蓝桥杯备赛过程

以国优秀结束了蓝桥杯cb组 鄙人来自电信学院,非科班出身,在寒假,大约2024年2月份,跟着黑马程序员将c基础语法学完了,因为过年,事情较多,没在学了。 最初就是抱着拿省三的态度去打这个比赛的&a…

C语言之旅:探索单链表

目录 一、前言 二、实现链表的功能: 打印 创建节点 尾插 尾删 头插 头删 查找 在指定位置之前插入数据 指定位置删除 在指定位置之后插入数据 打印 销毁 三、全部源码: 四、结语 一、前言 链表是一个强大且基础的数据结构。对于很多初…

禁用手机连接 - Win11

问题 Win11系统自带手机连接软件,会在后台自启,不适用于全部的手机型号,而且常规方法无法卸载。甚至任务管理器中,此软件的后台进程高达76个,如下图。下文以Win11系统为例,介绍如何禁用手机连接。 解决方…

考研数学:有些无穷小不能用等价无穷小的公式?

今天要给大家分享的笔记是:《有些无穷小虽然是无穷小,但却不能用无穷小的相关公式》:

Winform GDI+双缓冲绘图与GDI API双缓冲绘图

一、GDI双缓冲绘图 BufferedGraphicsContext GraphicsContext BufferedGraphicsManager.Current;BufferedGraphics myBuffer GraphicsContext.Allocate(e.Graphics, e.ClipRectangle);Graphics g myBuffer.Graphics;Bitmap bitmap bitmaps[index];g.DrawImage(bitmap, 0, 0…

来自大厂硬盘的降维打击!当希捷酷玩520 1TB SSD卷到369,请问阁下该怎么应对?

来自大厂硬盘的降维打击!当希捷酷玩520 1TB SSD卷到369,请问阁下该怎么应对? 哈喽小伙伴们好,我是Stark-C~ 今年4月份的时候因为电脑上的游戏盘突然挂掉,为了性价比选购了希捷酷玩520 1TB SSD,同时我也是…

vue3加axios配合element-plus实现图片等文件本地上传,并获取服务器返回的真实地址数据,前端写法

小白写法嘿嘿 开发工具和关键词 开发工具: vscode 关键词:vue3、element-plus、axios 后端 后端业务逻辑处理使用的是unicloud的云函数,大家可以看我上一篇文章。 思路 1、禁止element-plus的el-upload组件自动上传,变成手动上传…

装修10个容易被遗忘的开关插座位置

雅静说家里开关插座哪些最容易忘记了留?      一共10个,你看看有少的吗,我家水电师父就没有留够      来了又重新补的很麻烦,记得收藏      1,大门口上边留一个,后期可以安装监控      特别家里有老人和小孩,以及经常来快递的      2,弱电箱留…

7. MySQL 视图、索引

文章目录 【 1. 视图 View 】1.1 视图原理1.2 创建视图 CREATE VIEW1.2.1 创建基于单表的视图1.2.2 创建基于多表的视图 1.3 查看视图1.3.1 查看视图的内容1.3.2 查看视图的详细信息 1.4 修改视图 ALTER VIEW1.4.1 修改视图内容1.4.2 修改视图名称 1.5 删除视图 DORP VIEW 【 2…

961题库 北航计算机 计算机网络 附答案 选择题形式

有题目和答案,没有解析,不懂的题问大模型即可,无偿分享。 第1组 习题 OSI 参考模型的第 5 层( 自下而上 ) 完成的主要功能是 A. 差错控制 B. 路由选择 C. 会话管理 D. 数据表示转换 100BaseT 快速以太网使用的导向传输介质是 A. 双绞线 B. …

Gin的快速入门和搭建

文章目录 Go的工程工程架构技术选型 Gin入门 Go的工程 基于Go生态,构建一个支持内容管理,内容加工、内容分发的内容库系统。 内容管理:增删改查内容加工:例如内容审核、推荐等内容分发:将内容可以推到不同的业务线 …

linux进阶的一些操作以及知识点------习题集(实践)

请创建以你姓名全拼的用户luwenhua,将其设置为免密登录,切换到luwenhua用户,打开终端,完成以下操作 (一)bash脚本基础练习 1)第一题:请在终端里定义两个用户变量num120&#xff0c…

C# try catch异常捕获

异常捕获 执行过程:try中的代码没有出现异常,则catch里面不会自行,如果try中代码出现异常,则后面的代码都不执行,直接跳到catch中的代码执行。 // try catch 可以捕获多个错误, try...catch...catch.... …

【HarmonyOS】 多层嵌套对象通过@ObjectLink和@Observed实现渲染更新处理!

【HarmonyOS】 多层嵌套对象通过ObjectLink和Observed实现渲染更新处理! 一、问题背景: 上文讲过 (【HarmonyOS】List组件多层对象嵌套ForEach渲染更新的处理)对多层嵌套的简单处理,即:深拷贝item数据&…

C++一个StringBad类

设计一个字符串类,下面的代码是一个不好的设计,起名StringBad。 //stringbad.h #pragma once //一个设计有问题的string类 #include <iostream> using namespace std;class StringBad { public:StringBad();//默认构造函数StringBad(const char* s);//构造函数~StringBa…

计算机毕业设计 | springboot+vue会议室管理系统(附源码)

1&#xff0c;绪论 1.1 项目背景 随着企业规模的不断扩大&#xff0c;会议室管理愈加复杂。传统的手工预约会议室的方式已经无法满足现代企业的需求&#xff0c;因此&#xff0c;开发一套会议室系统方案变得尤为重要。会议室系统可以实现会议室的在线预约、会议室资源的有效利…