【JAVA基础之内部类】匿名内部类

🔥作者主页:小林同学的学习笔录

🔥小林同学的专栏:JAVA之基础专栏

目录

1.内部类

1.1 概述

1.1.1 什么是内部类

1.1.2 什么时候使用内部类

1.2 内部类的分类

1.3 成员内部类

1.3.1  获取成员内部类对象的两种方式

1.3.2  经典面试题

1.4  静态内部类

1.4.1  静态内部类对象的创建格式

1.5  局部内部类

1.6  匿名内部类

1.6.1  引出匿名内部类 

1.6.2  匿名内部类用处

1.6.3  匿名内部类的使用场景


1.内部类

1.1 概述

1.1.1 什么是内部类

将一个类A定义在另一个类B里面,里面的那个类A就称为内部类,B则称为外部类,其他称为外部其他类可以把内部类理解成寄生,外部类理解成宿主。

1.1.2 什么时候使用内部类

一个事物内部还有一个独立的事物,内部的事物脱离外部的事物无法独立使用

  1. 人里面有一颗心脏。

  2. 汽车内部有一个发动机。

  3. 目的为了实现更好的封装性。

1.2 内部类的分类

按定义的位置来分

  1. 成员内部内,类定义在了成员位置 (类中方法外称为成员位置,无static修饰的内部类)

  2. 静态内部类,类定义在了成员位置 (类中方法外称为成员位置,有static修饰的内部类)

  3. 局部内部类,类定义在方法内

  4. 匿名内部类,没有名字的内部类,可以在方法中,也可以在类中方法外。

1.3 成员内部类

类定义在成员位置上

1.3.1  获取成员内部类对象的两种方式

  • 方式一:外部直接创建成员内部类的对象
    • 外部类.内部类 变量 = new 外部类().new 内部类();
  • 方式二:在外部类中定义一个方法提供内部类的对象(一般用在内部类用private修饰才用到)

代码演示:

方式一:
public class Test {public static void main(String[] args) {//  宿主:外部类对象。// Outer out = new Outer();// 创建内部类对象。Outer.Inner oi = new Outer().new Inner();oi.method();}
}class Outer {// 成员内部类,属于外部类对象的。// 拓展:成员内部类不能定义静态成员。public class Inner{// 这里面的东西与类是完全一样的。public void method(){System.out.println("内部类中的方法被调用了");}}
}方式二:
public class Outer {String name;private class Inner{static int a = 10;}public Inner getInstance(){return new Inner();}
}public class Test {public static void main(String[] args) {Outer o = new Outer();System.out.println(o.getInstance());}
}

1.3.2  经典面试题

public class Test {public static void main(String[] args) {Outer.inner oi = new Outer().new inner();oi.method();}
}class Outer {	// 外部类private int a = 30;// 在成员位置定义一个类class inner {private int a = 20;public void method() {int a = 10;System.out.println(???);	// 10   答案:aSystem.out.println(???);	// 20	答案:this.aSystem.out.println(???);	// 30	答案:Outer.this.a}}
}

执行原理:

1.4  静态内部类

静态内部类可以直接访问外部类的静态成员。

静态内部类不可以直接访问外部类的非静态成员,如果要访问需要创建外部类的对象。

静态内部类中没有虚拟机所创建的Outer.this

如何调用静态内部类的方法?

  • 非静态方法:创建对象,并调用方法
  • 静态方法:外部类名.内部类名.方法名()

1.4.1  静态内部类对象的创建格式

外部类.内部类  变量 = new  外部类.内部类构造器;

代码演示:

// 外部类:Outer01
class Outer01{private static  String sc_name = "小白";private String sc_age = 24;// 内部类: Inner01public static class Inner01{// 这里面的东西与类是完全一样的。private String name;public Inner01(String name) {this.name = name;}public void showName(){System.out.println(this.name);// 拓展:静态内部类可以直接访问外部类的静态成员。System.out.println(sc_name);//访问外部类的非静态的变量需要创建外部类的对象Outer01 outer01 = new Outer01();System.out.println(outer.sc_age);}}
}public class InnerClassDemo01 {public static void main(String[] args) {// 创建静态内部类对象。// 外部类.内部类  变量 = new  外部类.内部类构造器;Outer01.Inner01 in  = new Outer01.Inner01("张三");in.showName();}

1.5  局部内部类

将内部类定义在方法里面就叫做局部内部类,类似于方法中的局部变量

外部类是无法直接获取局部内部类的,需要创建该类的对象,然后再进行使用

该类可以直接访问外部类的成员,也可以访问方法内的局部变量

public class Outer {private int outerField = 10;public void outerMethod() {final int localVar = 20;//局部内部类class LocalInner {void display() {System.out.println("Outer Field: " + outerField);System.out.println("Local Variable: " + localVar);}}//外部类获取内部类信息,需要创建对象LocalInner inner = new LocalInner();inner.display();}public static void main(String[] args) {Outer outer = new Outer();outer.outerMethod();}
}

1.6  匿名内部类

1.6.1  引出匿名内部类 

正常类:

匿名内部类(Student被匿名):

代码演示:

interface Swim {public abstract void swimming();
}public class Demo07 {public static void main(String[] args) {// 使用匿名内部类对象,并且调用匿名内部类里面的方法new Swim() {@Overridepublic void swimming() {System.out.println("自由泳...");}}.swimming();// 接口 变量 = new 实现类(); // 多态,走子类的重写方法Swim s2 = new Swim() {@Overridepublic void swimming() {System.out.println("蛙泳...");}};s2.swimming();s2.swimming();}
}

注意:

new Swim(){@Overridepublic void swim() {System.out.println("Demo01匿名内部类");}
};

这样的话是不会有打印数据的,因为整体只是一个匿名内部类对象,需要再去调用相应的成员

匿名内部类字节码文件反编译看到的效果

实际案例:

public class Test01 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("11");list.add("12");list.add("13");//下面就是一个匿名内部类list.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}});}
}

反编译之后

1.6.2  匿名内部类用处

匿名内部类在Java中有着一些重要的用途,其中包括:

  1. 简化代码:使用匿名内部类可以减少代码量,避免编写大量的类定义。

  2. 事件处理器:在GUI编程中常常使用匿名内部类来实现事件处理器,如按钮点击事件、菜单项选择等。

  3. 回调函数:匿名内部类也可以用作回调函数的实现,例如对异步任务的处理。

  4. 接口实现:如果只需要使用接口的一次实例,可以直接使用匿名内部类来实现接口的抽象方法。

  5. 方法重写:可以在匿名内部类中重写父类或接口的方法,以实现特定的逻辑。

总之,匿名内部类提供了一种简洁、灵活的方式来实现某些具体功能,通常用于临时、一次性的场景中。

1.6.3  匿名内部类的使用场景

interface Swim {public abstract void swimming();
}public class Demo07 {public static void main(String[] args) {// 普通方式传入对象// 创建实现类对象Student s = new Student();goSwimming(s);// 匿名内部类使用场景:作为方法参数传递Swim s3 = new Swim() {@Overridepublic void swimming() {System.out.println("蝶泳...");}};// 传入匿名内部类goSwimming(s3);// 完美方案: 一步到位goSwimming(new Swim() {public void swimming() {System.out.println("大学生, 蛙泳...");}});goSwimming(new Swim() {public void swimming() {System.out.println("小学生, 自由泳...");}});}// 定义一个方法,模拟请一些人去游泳public static void goSwimming(Swim s) {s.swimming();}
}

总结:

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

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

相关文章

用C语言把一棵普通二叉树安排得明明白白

1. 树的相关术语 结点的度&#xff1a;一个结点含有的子树的个数称为该结点的度&#xff1b; 如上图&#xff1a;A的为6 叶结点或终端结点&#xff1a;度为0的结点称为叶结点&#xff1b; 如上图&#xff1a;B、C、H、I...等结点为叶结点 非终端结点或分支结点&#xff1a;度不…

【Linux】-Tomcat安装部署[12]

目录 简介 安装 安装部署JDK环境 解压并安装Tomcat 简介 Tomcat是由Apache开发的一个Servlet容器&#xff0c;实现了对Servlet和JSP的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#…

【软件工程】【23.10】p2

关键字&#xff1a; 软件复用技术、过程途径、特定需求是文档核心、数据字典条目、高内聚低耦合独立性、数据流图映射模块结构图、UML依赖、用例图关系、RUB迭代、程序规格说明等价类划分、有效性测试的目标、喷泉模型面向对象、软件验证过程、CMMI

【Linux】Centos7安装RabbitMQ

【Linux】Centos7安装RabbitMQ 下载 从 rabbitmq 的 GitHub 仓库下载 https://github.com/rabbitmq/rabbitmq-server/releases rabbitmq 是 erlang 语言编写的&#xff0c;需要先安装 erlang https://github.com/rabbitmq/erlang-rpm/releases 安装 使用rz命令上传 erlang 和 …

Polar 网站被黑

Polar 网站被黑 开题&#xff0c;挺好看的前端&#xff0c;可惜啥也没有。 信息搜集一波&#xff0c;扫目录出现几个敏感目录&#xff0c;但是没什么用。 继续搜集&#xff0c;在返回包中发现了HINT F5XDAXZQNZSV6ZRRNZSF63JTF4base32解码后是一个路由/n0_0ne_f1nd_m3/&#x…

数据仓库实验四:聚类分析实验

目录 一、实验目的二、实验内容和要求三、实验步骤1、建立数据表2、建立数据源视图3、建立挖掘结构Student.dmm4、部署项目并浏览结果5、挖掘模型预测 四、实验结果分析五、实验总结体会 一、实验目的 通过本实验&#xff0c;进一步理解基于划分的、基于层次的、基于密度的聚类…

Easy-poi 和 EasyExcel 选型

目录 共同点地址如何选 共同点 easy-poi 和 easyexcel 都是基于 apache poi 进行二次开发的&#xff0c;底层都是依赖的 apache poi使用简单&#xff0c;都可以通过简单的注解实现excel文件的导入导出 地址 esay poi 是一个开源的 excel,word 处理框架。链接 easy excel 是…

Xed编辑器开发第二期:使用Rust从0到1写一个文本编辑器

第三篇 这部分接着处理用户退出命令以及一些其他新功能&#xff1b; 3.1 使用CtrlQ退出 modifiers: event::KeyModifiers::CONTROL,使用CONTROL替换之前的NONE值即可&#xff1b; 3.2 重构键盘输入 让我们重构我们的代码&#xff0c;以便我们有一个用于低级按键读取的函数&…

《Rust奇幻之旅:从Java和C++开启》第1章Hello world 2/5

讲动人的故事,写懂人的代码 很多程序员都在自学Rust。 🤕但Rust的学习曲线是真的陡,让人有点儿怵头。 程序员工作压力大,能用来自学新东西的时间简直就是凤毛麟角。 📕目前,在豆瓣上有7本Rust入门同类书。它们虽有高分评价,但仍存在不足。 首先,就是它们介绍的Rust新…

什么是谷歌爬虫?

其实就是谷歌用来浏览网络信息的一个自动化程序&#xff0c;他们会在你的网站爬取&#xff0c;寻找和搜集信息&#xff0c;谷歌爬虫可以说决定着一个网站在谷歌的生死 谷歌爬虫的作用机制就在于发现新网站以及新网页&#xff0c;然后他会把网页的内容带回去&#xff0c;更新到…

PikaUnsafe upfileupload

1.client check 客户端检测&#xff0c;前端js检测&#xff0c;禁用js和修改后缀名即可。 php格式不能上传&#xff0c;我们修改后缀上传。 蚁剑成功连接。 2.MIME type 这个就是 content-type 规定上传类型&#xff0c;上面的方法也能成功&#xff0c;也可以修改 conten-ty…

面试框架【面试准备】

前言 2023-9-12 12:12:04 2023-09-14 16:13:04 公开发布于 2024-5-22 00:16:21 以下内容源自《【面试准备】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.net/qq_51625007 禁止其他平…

奇偶数递增递减-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第70讲。 奇偶数递增递减&a…

vite+ts+mock+vue-router+pinia实现vue的路由权限

0.权限管理 前端的权限管理主要分为如下&#xff1a; 接口权限路由权限菜单权限按钮权限 权限是对特定资源的访问许可&#xff0c;所谓权限控制&#xff0c;也就是确保用户只能访问到被分配的资源 1.项目搭建 创建vite项目 yarn create vite配置别名 npm install path -…

4. C++入门:内联函数、auto关键字、范围for及nullptr

内联函数 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率 对比C的宏 C语言不足&#xff1a;宏 #define ADD(x, y) ((x)(y))int main() {int ret…

python实现520表白图案

今天是520哦&#xff0c;作为程序员有必要通过自己的专业知识来向你的爱人表达下你的爱意。那么python中怎么实现绘制520表白图案呢&#xff1f;这里给出方法&#xff1a; 1、使用图形库&#xff08;如turtle&#xff09; 使用turtle模块&#xff0c;你可以绘制各种形状和图案…

Docker 安装kingbase V8r6

下载 官网下载&#xff0c;注意&#xff1a;这里下载 Docker 版本v8r6 安装 # 导入镜像 docker load -i kingbase.tar# 重命名 docker tag [image-name]:[tag] [new-image-name]:[new-tag]# 删除 docker rmi [image-name]:[tag]# 创建容器 docker run -tid \ --privileged \…

【前端】使用 Canvas 实现贪吃蛇小游戏

使用 Canvas 实现贪吃蛇小游戏 在这篇博客中&#xff0c;我们将介绍如何使用 HTML5 Canvas 和 JavaScript 实现一个简单的贪吃蛇&#xff08;Snake&#xff09;小游戏。这个项目是一个基础的游戏开发练习&#xff0c;它可以帮助你理解如何在 Canvas 上绘图、如何处理用户输入以…

Android:OkHttp网络请求框架的使用

目录 一&#xff0c;OkHttp简介 二&#xff0c;OkHttp请求处理流程 三&#xff0c;OkHttp环境配置 四&#xff0c;OkHttp的使用 1.get网络请求 2.post上传表单数据 3.post上传json格式数据 4.文件上传 5.文件下载 一&#xff0c;OkHttp简介 OkHttp是square公司推出的一…

rust的版本问题,安装问题,下载问题

rust的版本、安装、下载问题 rust版本问题&#xff0c; 在使用rust的时候&#xff0c;应用rust的包&#xff0c;有时候包的使用和rust版本有关系。 error: failed to run custom build command for pear_codegen v0.1.2 Caused by: process didnt exit successfully: D:\rus…