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

Java 五种内部类演示及底层原理详解

内部类

什么是内部类

在A类的内部定义B类,B类就被称为内部类

发动机类单独存在没有意义 发动机为独立个体

可以在外部其他类里创建内部类的对象去调用方法

类的五大成员

属性 方法 构造方法 代码块 内部类

内部类的访问特点

内部类可以直接访问外部类的成员,包括私有

外部类要访问内部类的成员,必须创建对象

访问特点原因

如果在测试类中调用show方法 必须先创建对象

然后给对象的属性赋值

当当前方法被调用时

java虚拟机会把调用方法者的地址值传递给this

所以在代码中打印 时 打印调用者的信息

不然就找不到了 找不到对象

ArrayList类源代码

ArrayList类 集合类

集合存储数据

通过遍历可以获得数据

ArrayListL里有个内部类叫迭代器Itr

对于集合类来说相对独立,而又属于集合,所以设为内部类

对内部类总结

1.什么是内部类

写在一个类里面的类叫做内部类

2.什么时候用到内部类

B类表示的事物是A类的一部分,且B单独存在没有意义

比如汽车的发动机 ArrayList类的迭代器 人的心脏

内部类的种类

成员内部类

了解

写在成员位置 属于外部类的成员

成员内部类代码如何书写

如果用private私有修饰内部类对象

那只能在外部类中创建对象

private修饰符 只能在本外部类中使用

默认权限可以只在本包中使用

protected修饰符 可以在本包中的其他类中使用 可以在其他包的子类也可以用

外面的孩子也是受保护的

public修饰符 公共的 随处都可以创建对象

如何创建成员内部类的对象

方法1: 直接创建格式 外部类名.内部类名 对象名=外部类对象.内部类对象

成员内部类实际上和成员变量 成员方法本质是一样的

通过创建对象去调用 注意使用链式编程

方式2:在外部类中编写方法 对外提供内部类的对象

通过在外部类编写 getInstance方法 获得被private修饰的内部类方法

测试类接收方法

两种方式

1.用父类接收 形成多态

2.直接获取对象

面试题

内存图

在堆内存里外部类对象先加载进去 再加载内部类对象 开辟新空间

java会给内部类对象一个隐藏的this变量用来记录外部类的地址值

总结

静态内部类

静态内部类只能访问外部类中的静态变量和静态方法

如果想要访问非静态的需要创建对象

只要是静态的东西都可以用类名.直接使用

调用非静态内部类中的方法

调用静态内部类中的方法

总结

特殊的成员内部类 静态内部类

创建静态内部类对象的方式 Outer.inner.oi=new Outer.Inner();

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

局部内部类

了解即可

将内部类定义在方法里面

类似于方法里的局部变量

外部是无法直接使用的 需要在方法内部创建对象并使用

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

匿名内部类

相对最重要的

匿名内部类本质上是隐藏了名字的内部类

书写格式

如下图

匿名内部类实质上是swim类接口的实现类

student类实现swim类接口

重写swim类中的抽象方法

实现后 上去名字

swim后花括号里的内容即为swim接口的实现类

先把前面的class去掉 剩下的内容就是一个没有名字的类

表示这个没有名字的类实现的swim类的接口 所以要在类中重写接口中所有的抽象方法

如何创建没有名字类的对象

创建对象 new 类名();

即把new方法放到swim前面 再在后面加上()表示用空参构造构建

new是创建花括号里没有名字类的对象

匿名内部类实际上是对象 整体是一个对象 即为匿名内部类的对象

中间的格式

继承关系

花括号里的内容是animal的子类

等号左右是接口 右边是接口实现类对象

形成接口多态

并且

总结

匿名内部类是隐藏了名字的内部类

可以写在成员位置 也可以写在局部位置

格式:

new 类名或者接口名(){

重写方法

}

包括继承或实现,方法的重写,创建对象

整体就是一个类的子类对象或者接口的实现类对象

使用场景

当方法的参数是接口或者类时

以接口为例,可以传递这个接口的实现类对象

如果实现类只使用一次,可以用匿名内部类来简化代码

相关文章:

  • zibll-V7.7最新版2024完美破解授权可用(含授权教程)
  • Typescript高级: 深入理解Partial类型和Required类型
  • linux tomcat版本漏洞升级
  • B站如何屏蔽短视频:成都鼎茂宏升文化传媒公司
  • 从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭
  • Gitlub如何删除分支(删除远程分支+本地分支)
  • 彻底卸载Windows Defender
  • 童心与美食的邂逅,蒙自源邀你共绘梦想画卷
  • 使用YOLOv10训练自己的数据集
  • Java基础八股
  • opencv笔记(13)—— 停车场车位识别
  • 银行批量支付业务功能测试点详细介绍
  • C语言编程零基础:开启编程之旅的起点
  • 乡镇围栏数据存储ES实践
  • MySQL之创建高性能的索引(十二)
  • css的样式优先级
  • E-HPC支持多队列管理和自动伸缩
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Linux CTF 逆向入门
  • MySQL几个简单SQL的优化
  • Node项目之评分系统(二)- 数据库设计
  • oschina
  • Otto开发初探——微服务依赖管理新利器
  • React组件设计模式(一)
  • windows下如何用phpstorm同步测试服务器
  • 安卓应用性能调试和优化经验分享
  • 百度小程序遇到的问题
  • 从0实现一个tiny react(三)生命周期
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 解析带emoji和链接的聊天系统消息
  • 老板让我十分钟上手nx-admin
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 区块链共识机制优缺点对比都是什么
  • 实现简单的正则表达式引擎
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​TypeScript都不会用,也敢说会前端?
  • ​决定德拉瓦州地区版图的关键历史事件
  • #面试系列-腾讯后端一面
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • $(function(){})与(function($){....})(jQuery)的区别
  • (CPU/GPU)粒子继承贴图颜色发射
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (八)c52学习之旅-中断实验
  • (全注解开发)学习Spring-MVC的第三天
  • (一)kafka实战——kafka源码编译启动
  • (转)大道至简,职场上做人做事做管理
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .naturalWidth 和naturalHeight属性,
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)