【自学笔记】01Java基础-07面向对象基础-04接口与内部类详解

记录学习Java基础中有关接口类和内部类的知识。

1 接口

interface 关键字用于定义接口类,接口类是一系列方法的声明,一般只有方法的特征没有方法的实现,因此可以被不同的类接入实现,而这些实现可以具有不同的行为(功能)。

接口类似于抽象类(抽象类概念),其所有的方法默认是公开且抽象的(默认 public abstract 修饰),所有的成员变量默认是静态、不可变的常量public static final)。Java8开始,接口类也可以有非抽象的static静态方法和default方法,java9新增只能内部访问的private方法。

1.1 接口类的声明

  • 使用 interface 关键字来定义一个接口。接口中所有的成员都是public的,即使不显式声明。

public interface InterfaceClass {// 常量声明,默认public static finalint CONSTANT_VARIABLE = 10;    // 方法声明,默认是public abstract,可以省略void someMethod();// 默认方法defaultdefault void myDefaultMethod() {// ...}// 静态方法staticstatic void myStaticMethod() {// ...}
}
  • 接口类方法

    • 接口中的所有方法默认具有 public abstract 修饰符(即使没有声明),实现了该接口的类必须实现所有方法。(java8新增的方法除外)
    • default方法:从java8开始,可以含default声明的方法,实现类可以直接使用或实现方法来覆写这类方法。
    • static静态方法:从java8开始,可以含static声明的方法,实现类可以直接类名.方法名()调用,但不能实现。
    • private私有方法:从java9开始,可以含private声明的方法,只能被本类其他默认方法或私有方法使用。
  • 静态常量

    • 接口中只能声明常量,无需显式声明 public static final,它们自动具有这些修饰符,并且必须初始化赋值。
      在这里插入图片描述

1.2 实现类的声明

  • 使用 implements 关键字来实现一个或多个接口,并提供接口中声明的所有抽象方法的实现。
  • 如果实现类不能实现接口的所有抽象方法,这个类需要声明为抽象类。>抽象类概念
public class ImplClass implements InterfaceClass_1,InterfaceClass_2 {@Overridepublic void someMethod() {// 实现接口类中所有非静态的方法体// 接口类中default声明的方法可选实现}
}

1.3 接口的实现对比抽象类的继承

  • 类和类的关系:单继承。
  • 类和接口的关系:多实现。
  • 接口和接口的关系:多继承,一个接口可以同时继承多个接口。

1.4 接口多继承的作用

规范合并,整合多个接口为同一个接口,便于子类实现。

1.5 接口的注意事项

1、接口不能创建对象
2、一个类实现多个接口,多个接口的规范不能冲突
2、一个类实现多个接口,多个接口中有同样的静态方法不冲突。(使用接口.方法名()调用)
3、一个类继承了父类,同时又实现了接口,父类中和接口中有同名方法,默认用父类的。
4、一个类实现了多个接口,多个接口中存在同名的默认方法,可以不冲突,这个类重写该方法即可。
5、一个接口继承多个接口,是没有问题的,如果多个接口中存在规范冲突则不能多继承。

1.6 接口的作用

  • 接口主要用于定义某种规范或者协议,确保不同类的对象之间能够共享相同的行为特征。
  • 它们在设计模式中广泛用于实现松耦合和面向接口编程,有助于提高代码的可重用性和可扩展性。

2 内部类

内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。

public class People{// 内部类public class Heart{}
}

内部类的使用场景

  • 场景:当一个事物的内部,还有一个部分需要一个完整的结构进行描述时。

基本作用

  • 内部类通常可以方便访问外部类的成员,包括私有的成员。
  • 内部类提供了更好的封装性,内部类本身就可以用private ,protectecd等修饰,封装性可以做更多控制

2.1 内部类的分类

  • 静态内部类[了解]
  • 成员内部类(非静态内部类) [了解]
  • 局部内部类[了解]
  • 匿名内部类(重点)

2.2 静态内部类[了解]

什么是静态内部类?

  • 有static修饰,属于外部类本身。
  • 它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别的类里面而已。
    在这里插入图片描述
    在这里插入图片描述

2.3 成员内部类[了解]

什么是成员内部类?

  • 无static修饰,属于外部类的对象。
  • JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    答案:heartbeat, this.heartbeat, People.this.heartbeat

2.4 局部内部类[了解]

在这里插入图片描述

2.5 匿名内部类【重点】

  • 本质上是没有名字的局部内部类,同时也是一个对象,因此在创建时既声明又实例化。
  • 同时代表一个对象,其对象类型为当前new的那个类的子类。
  • 匿名内部类通常用在只使用一次且不需要单独定义一个类的情况下,简化代码编写。
  • 匿名内部类可以继承非静态(static)的外部类,实现重写外部类的方法,只在匿名内部类内部会生效。开发中一般不会这样使用。
  • 匿名内部类可以继承抽象类,并必须实现里面所有抽象方法。
  • 匿名内部类可以实现一个或多个接口,并必须实现所有接口中所有抽象方法。

1. 使用场景:

  • 当需要快速定义一个类来响应事件(如:Java Swing中的ActionListener)。
  • 当需要临时实现一个接口而不想为此创建单独的类文件时。

2. 定义与创建:
匿名内部类的格式如下:

//创建方式,new+类名()
new 外部类名() | 实现接口名() | 抽象类名(){// 实现父类方法或接口方法// 可以定义自己的成员变量和方法
};
//引用给对象
类名 对象名 = new 外部类名() | 实现接口名() | 抽象类名(){...}
Class c = new Class(){public void run(){}
};
c.run();

例如,实现一个Runnable接口的匿名内部类:

new Runnable() {@Overridepublic void run() {System.out.println("Running in anonymous class");}
}.run();

或者继承一个抽象类并覆盖其方法:

abstract class Animal {abstract void sound();
}new Animal() {@Overridevoid sound() {System.out.println("Animal makes a sound");}
}.sound();

3. 特点:

  • 没有名称:匿名内部类由于没有名字,所以不能被引用,只能通过其父类或接口类型引用。
  • 局部作用域:匿名内部类可以访问包含它的外部类的所有成员(包括私有成员),同时也可以定义自己的局部变量,但这些变量必须是final或者事实上是final的。
  • 构造器限制:匿名内部类没有独立的构造函数,初始化过程通过构造代码块完成,即在类体中直接初始化成员变量。
  • 静态限制:匿名内部类不能包含静态成员、静态初始化块和静态方法,因为它们没有类名,无法直接指向静态成员。
  • 生命周期依赖外部类:匿名内部类的对象会隐式持有对外部类对象的引用,其生命周期受外部类实例的影响。

4. 注意事项:

  • 如果匿名内部类要访问外部方法的参数或者局部变量,那么这些变量必须是final或者实际上不可变的(尽管在Java 8之后,编译器允许省略final关键字,但仍要求实际行为不变)。

以下是一个实际案例,展示匿名内部类用于实现事件监听器:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;// 假设我们有一个GUI组件(如按钮)
javax.swing.JButton button = new javax.swing.JButton("Click me!");// 按钮需要一个ActionListener来响应点击事件
// 而我们并不需要多次复用这个监听器,因此可以使用匿名内部类// 通过匿名内部类创建并实例化ActionListener
button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// 当按钮被点击时,执行的逻辑System.out.println("Button is clicked!");}
});// 添加监听器到按钮上
frame.add(button);// 显示GUI
// ...

在这个例子中,我们没有创建一个新的ActionListener子类,而是直接new一个临时的、未命名的类实现ActionListener接口。这样做的好处是能够将与按钮相关的操作逻辑紧密地封装在一起,同时简化代码编写。

另外,匿名内部类也可以用来扩展具体的类,例如在Android开发中,经常会有这样的场景:

public class MainActivity extends AppCompatActivity {private Button myButton;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myButton = findViewById(R.id.my_button);// 使用匿名内部类实现OnClickListener接口myButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "Button was clicked!", Toast.LENGTH_SHORT).show();// 在这里处理按钮点击事件}});}
}

在这个Android示例中,我们同样利用匿名内部类创建了一个OnClickListener对象,当myButton被点击时执行相应的逻辑。

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

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

相关文章

Graham扫描凸包算法

凸包(Convex Hull)是包含给定点集合的最小凸多边形。凸包算法有多种实现方法,其中包括基于递增极角排序、Graham扫描、Jarvis步进法等。下面,我将提供一个简单的凸包算法实现,基于Graham扫描算法。 Graham扫描算法是一…

多级缓存架构(一)项目初始化

文章目录 一、项目克隆二、数据库准备三、项目工程准备 一、项目克隆 克隆此项目到本地 https://github.com/Xiamu-ssr/MultiCache 来到start目录下,分别有以下文件夹 docker:docker相关文件item-service:springboot项目 二、数据库准备 …

Ncast盈可视高清智能录播系统busiFacade RCE漏洞(CVE-2024-0305)

产品介绍 Ncast盈可视高清智能录播系统是一套新进的音视频录制和播放系统,旨在提供高质量,高清定制的录播功能。 漏洞描述 广州盈可视电子科技有限公司的高清智能录播系统存在信息泄露漏洞(CVE-2024-0305),攻击者可通过该漏洞,…

Sectigo的DV通配符https

Sectigo是近些年发展比较快速的CA认证机构,为了提升审核效率,在全国成立了审核机构,亚太审核中心的成立加快了Sectigo旗下的https证书的审核速度。Sectigo的https证书可以为网站安全提供有力支持,从而保护网站信息安全。今天就随S…

3、深入解析Redis Cluster集群运维与核心原理

在今天的大规模分布式系统中,Redis Cluster已经成为了许多企业选择的分布式缓存方案之一。了解Redis Cluster的运维及核心原理对于确保系统的高可用性和性能至关重要。本文将深入探讨Redis Cluster集群的运维细节和核心原理,以帮助读者更好地理解和优化R…

【STM32】STM32学习笔记-MPU6050简介(32)

00. 目录 文章目录 00. 目录01. MPU6050简介02. MPU6050参数03. MPU6050硬件电路04. MPU6050框图05. MPU6050常用寄存器06. 附录 01. MPU6050简介 •MPU6050是一个6轴姿态传感器,可以测量芯片自身X、Y、Z轴的加速度、角速度参数,通过数据融合&#xff0…

网站监测工具的极与极,Site24x7 与百川云

今天我们聊聊我用 Site24x7 的感受。对于有网站监测有需求的站长们来说,Site24x7 确实是个很强大的应用。但是它与百川云网站监测完全不一样,百川云网站监测是适合用中小微企业的交互极简的saas 应用,Site24x7 完全是另一个极端,适…

datax关系数据库插件设计和实现解释

背景 DataX是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。解决异构数据源同步问题,DataX将复杂的网状的同步链路变成了星型数据链路&#xff0…

勒索家族瞄准制造业,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周(2024年第二期)全球共监测到勒索事件37起,事件数量持续下降,降至近半年最低值。 lockbit3.0仍然是影响最严重的勒索家族;akira和bianlian恶意家族也是两个活动频繁的恶意家族,需要注…

KubeSphere 在 vsleem 的落地实践

作者:方忠,苏州威视通智能科技有限公司技术经理,开源技术爱好者,长期活跃于 dromara 开源社区并参与贡献。 公司介绍 公司简介 苏州威视通智能科技有限公司,是一家全球领先的全景 AI 平台提供商,结合极致…

1.15作业

使用计数型信号量设计:生产者和消费者模型 总结今天学习的API函数,写出函数参数和返回值的意思,并且说明函数功能 创建队列 osMessageQueueId_t osMessageQueueNew (uint32_t msg_count, uint32_t msg_si…

Java项目:121SSM记账管理系统

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 记账管理系统基于SpringSpringMVCMybatis开发,系统主要功能如下: 收入项管理 支出项管理 收入方式管理 支出方式管理 添加收入…

《ORANGE’S:一个操作系统的实现》读书笔记(三十一)文件系统(六)

上一篇文章记录了对文件的读写操作,那么文件操作到目前为止,已经完成了创建和读写,还剩下的常用操作就是删除文件了。这篇文章就来记录删除文件的实现以及总结一下为文件系统添加系统调用的步骤。 删除文件 删除是添加的反过程,…

微服务自动化docker-compose

一、docker-compose介绍 Docker Compose是一个用来定义和运行多个复杂应用的Docker编排工具。例如,一个使用Docker容器的微服务项目,通常由多个容器应用组成。那么部署时如何快速启动各个微服务呢,一个个手动启动?假如有上百个微服…

计算机毕业设计 | SpringBoot+vue校园问卷调查系统(附源码)

1,绪论 研究目的 在进入21世纪以后,互联网得到了蓬勃的发展,电子问卷调查也开始逐渐流行起来。传统纸质问卷和电子问卷相比较后,传统问卷还存在很多弊端: 问卷分发起来比较困难,并且分发试卷耗费大量的金…

CSS 基本选择器 复合选择器

文章目录 基本选择器标记选择器类别选择器ID选择器测试基本选择器 复合选择器交集选择器并集选择器后代选择器全选选择器测试复合选择器 基本选择器 准备几个HTML标签用来测试 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"U…

智能小程序能做什么?

一. 自定义Tab页 涂鸦提供了丰富的场景化、个性化的 ToC 智能服务&#xff0c;不仅可以快速低成本的自由搭建出更多智能服务&#xff0c;还为你提供了基于小程序技术方案的可自主可控的自定义开发链路&#xff0c;为拓展更多品牌化、个性化、差异化智能服务提供生态基础。 我…

Javaweb之SpringBootWeb案例的详细解析

SpringBootWeb案例 前面我们已经讲解了Web前端开发的基础知识&#xff0c;也讲解了Web后端开发的基础(HTTP协议、请求响应)&#xff0c;并且也讲解了数据库MySQL&#xff0c;以及通过Mybatis框架如何来完成数据库的基本操作。 那接下来&#xff0c;我们就通过一个案例&#xf…

word无法插入方程式(方程式反灰)

word无法插入方程式&#xff08;方程式反灰&#xff09; 来自实测>插入方程式&#xff0c;反灰用不了>随便存在哪里&#xff0c;右键看属性&#xff1a;>发现真的是doc&#xff0c;得改成docx才可以&#xff1a;>打开原始档案&#xff0c;另存为word文件即可&#…

什么是google算法?

谷歌算法本身指的是谷歌针对搜索引擎做的规定 要想在别人的地盘玩&#xff0c;那肯定要了解这个地盘的规定&#xff0c;不然做了什么违反了规定&#xff0c;谷歌肯定不会让你继续玩下去 要想做谷歌&#xff0c;那肯定要了解谷歌的算法&#xff0c;然而谷歌的算法也不是一成不变…