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

【Java学习】匿名内部类的向外访问机制

目录

一、方法局部变量的访问

1.生命周期

1.1方法生命周期

1.2匿名实例生命周期

1.3生命超时性

2.变量捕获

2.1按值捕获

2.1.1值捕获优势

2.1.1.1生命及时访问

2.1.1.2线程安全

2.1.2常量值捕获优势

2.2按引用捕获

引用捕获风险

(1)生命超时访问

(2)线程不安全

二、外部类成员变量的访问

1.生命周期

1.1非静态成员

1.2静态成员

1.3生命及时性

2.引用访问

2.1非静态匿名类的引用访问

2.2静态匿名类的引用访问

3.线程安全问题


一、方法局部变量的访问

1.生命周期

1.1方法生命周期

方法的生命周期 方法调用开始 到 方法的最后一行执行完结束

1.2匿名实例生命周期

匿名内部类创建的 实例对象的生命周期 取决于对象的引用情况

对象被创建后,其生命周期 就独立于 创建它们的方法,当实例对象引用 传递到其它线程或方法里 继续引用该对象时,即使创建方法的生命周期结束,销毁了它里面的 该实例对象的引用,实例对象 仍然可能在其它地方 被引用而继续存在生命周期可以比创建方法的生命周期

1.3生命超时性

匿名内部类 在方法里面 定义类结构,实例对象的生命周期 可能比 局部变量的生命周期长,代表着实例对象的匿名内部类 可能会生命超时地 悬空访问 方法局部变量


2.变量捕获

匿名内部类 在方法中进行 定义类结构与创建实例,在方法中定义类结构时,会将局部方法的变量 复制捕获进内部类结构中 作成员变量 进行访问

2.1按值捕获

Java的匿名内部类 捕获所在创建方法的局部变量时,只复制捕获 方法局部变量的 final常量/等效final变量的 常量值 到内部类 作为新增的副本成员保存

2.1.1值捕获优势
2.1.1.1生命及时访问

复制捕获值 入副本成员 避免了 创建方法局部变量的生命 可能更短提前销毁 而造成的悬空访问的问题

2.1.1.2线程安全

同时如果一个方法中 定义有许多线程的匿名内部类,每个内部类 将同个方法的局部变量复制到各自内部类里面的 独立副本成员中,就不会形成 并发修改 同一外部方法局部变量 而造成线程安全问题

2.1.2常量值捕获优势

复制捕获final常量值 入副本常量成员常量在内部无法修改,避免了在内部修改副本成员变量 而外部方法局部变量实际不会改变的 可能错乱对应问题


2.2按引用捕获

C++的Lambda表达式捕获变量时,可以复制捕获 变量引用 入副本成员引用变量

引用捕获风险
(1)生命超时访问

在Lambda表达式内部 就能引用修改外部变量,要确保 实例对象的生命周期 最好不要超过 局部变量的作用域,可以通过延长局部变量生命周期 或限制Lambda不能访问已销毁的局部变量 来避免悬空引用问题

(2)线程不安全

当函数中定义多个 线程的匿名内部类时,要用同步机制 确保 多线程并发修改共同局部变量的 线程安全


二、外部类成员变量的访问

1.生命周期

1.1非静态成员

匿名内部类实例存在时,其内部就存储着 外部类的this引用,外部类就不可能被销毁生命周期安全地 访问外部类所有成员

1.2静态成员

关于类的实例还在,类就不会被卸载,匿名内部类实例的生命周期 一定小于 外部类的生命周期,生命周期安全地 访问外部类的静态成员

1.3生命及时性

外部类成员变量的生命周期 一定比 匿名内部类实例的生命周期,代表着实例对象的匿名内部类 一定生命及时地 安全访问 外部类的成员变量


2.引用访问

外部类成员变量的生命周期 一定比匿名内部类实例的生命周期长,所以就不使用 复制捕获变量访问,选择直接引用访问

2.1非静态匿名类的引用访问

在持有外部类实例引用的 非静态方法里面 定义匿名内部类的 类结构,内部类持有 外部类实例对的 this引用,可以访问外部类的所有成员

2.2静态匿名类的引用访问

静态方法里面 定义匿名内部类的 类结构,内部类只能访问外部类的静态成员


3.线程安全问题

多个匿名线程 并发访问同一成员变量时 有线程安全问题

http://www.lryc.cn/news/599065.html

相关文章:

  • Android Camera setRepeatingRequest
  • 星慈光编程虫2号小车讲解第三篇--附件概述
  • 星慈光编程虫2号小车讲解第四篇--触摸按键
  • 星慈光编程虫2号小车讲解第一篇--向前向后
  • 【Web APIs】JavaScript 节点操作 ⑧ ( 删除节点 - removeChild 函数 | 删除节点 - 代码示例 | 删除网页评论案例 )
  • 【软件与环境】--SSH连接远程服务器工具:FinalShell
  • LLM中的位置嵌入矩阵(Position Embedding Matrix)是什么
  • Python编程进阶知识之第五课处理数据(matplotlib)
  • 星慈光编程虫2号小车讲解第二篇--向左向右平移
  • Linux join命令快速从大文件中匹配内容
  • C语言:20250724笔记(函数-指针)
  • STL学习(?map容器)
  • Linux 内核基础统简全解:Kbuild、内存分配和地址映射
  • 量子威胁下的区块链进化:后量子密码学时代的分布式账本革命
  • 《 java 随想录》| 数组
  • ollama无法拉取模型导致报错
  • Java并发编程第八篇(CountDownLatch组件分析)
  • Python Day15 面向对象核心特性笔记 及 例题分析
  • 深度学习(鱼书)day01--感知机
  • 基于CloudBase+React+CodeBudddy的云上智能睡眠应用开发实践
  • Rust与YOLO目标检测实战
  • rust-结构体使用示例
  • 论文阅读:《无约束多目标优化的遗传算法,群体和进化计算》
  • Eureka-服务注册,服务发现
  • SpringBoot航空订票系统的设计与实现
  • 华为OpenStack架构学习9篇 连载—— 01 OpenStack架构介绍【附全文阅读】
  • docker pull weaviate 国内拉取失败的问题
  • java中如何返回一个可以执行返回操作(return action)的函数或对象
  • rust-枚举
  • 技术赋能多元探索:我的技术成长与行业洞察