【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.pswp.cn/web/90484.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90484.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90484.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LinkedList的模擬實現+LinkedList和ArrayList的區別

目錄 LinkedList的模擬實現 什么是雙向鏈表 增加數據 頭插法: 尾插法: 指定的下標插入: 刪除數據 刪除雙向鏈表中出現的第一個key 置空所有數據 LinkedList和ArrayList的區別 順序表對應的集合類是ArrayList;鏈表對應的集…

Vue + WebSocket 實時數據可視化實戰:多源融合與模擬數據雙模式設計

在現代交通大屏項目中,實時數據的采集和可視化尤為重要。本文結合 Vue3 和 ECharts,分享一個支持多 WebSocket 數據源實時合并、模擬數據調試、自動重連的完整設計方案,幫助你快速搭建健壯的數據可視化組件。一、項目背景與核心需求實時接收多…

C#索引器、接口、泛型

以下是對提供的 C# 代碼中涉及的核心知識點的梳理和總結,涵蓋索引器、接口、泛型三大核心內容,以及相關實踐要點:一、索引器(Indexer)索引器是一種允許類或結構體像數組一樣通過[]語法訪問成員的特殊成員,本…

界面組件DevExpress WPF中文教程:Grid - 如何過濾節點?

DevExpress WPF擁有120個控件和庫,將幫助您交付滿足甚至超出企業需求的高性能業務應用程序。通過DevExpress WPF能創建有著強大互動功能的XAML基礎應用程序,這些應用程序專注于當代客戶的需求和構建未來新一代支持觸摸的解決方案。 無論是Office辦公軟件…

Excel——INDEX和MATCH傻傻分不清?

核心邏輯?先用 MATCH 找到目標姓名在表格中的 ?行號,再用 INDEX 根據行號 ?提取對應信息。就像查字典:先用拼音找到字的頁碼(MATCH 找行號)再翻到該頁看具體解釋(INDEX 取數據)?分步拆解(以…

制造業低代碼平臺實戰評測:簡道云、釘釘宜搭、華為云Astro、金蝶云·蒼穹、斑斑低代碼,誰更值得選?

上回聊了斑斑和簡道云,不少同行私信問我其他幾個低代碼平臺怎么樣,今天就給大家來個"五大門派"終極對決! 一、先說痛點 制造業搞數字化最怕三件事: 1.錢花了沒效果(大平臺用不起,小工具不夠用&…

Jenkins中HTML文件顯示樣式問題解決方案

Jenkins中HTML文件顯示樣式問題解決方案 問題描述 在Jenkins中歸檔的HTML文件顯示格式失效,樣式無法正常顯示,但在本地瀏覽器中打開卻能正常顯示。 問題原因 Jenkins為了安全考慮,默認設置了嚴格的內容安全策略(Content Security Policy, CSP…

四、配置文件

文章目錄1. 文件類型1.1 properties1.2 yaml1.2.1 簡介1.2.2 基本語法1.2.3 數據類型1.2.4 示例2. 配置提示1. 文件類型 1.1 properties 同以前的properties的用法 1.2 yaml 1.2.1 簡介 YAML 是 “YAML Ain’t Markup Language”(YAML 不是一種標記語言&#x…

Python常用醫療AI庫以及案例解析(場景化進階版)

?? 框架應用拓撲圖用例 #mermaid-svg-lZ1J5KCaVWBV2kAu {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-icon{fill:#552222;}#mermaid-svg-lZ1J5KCaVWBV2kAu .error-text{fill:#552222;st…

Python高效操作Kafka實戰指南

Python操作Kafka的高效 以下是使用Python操作Kafka的高效消息發送實例,涵蓋基礎發送、批量處理、異步回調等場景。示例基于confluent-kafka庫(推薦)和kafka-python庫,代碼均經過實測。 流程圖 基礎消息發送(同步) from confluent_kafka import Producerproducer = Pro…

離線快速處理PDF格式轉化的方案

日常辦公中,PDF 幾乎成了我們離不開的文件格式。然而像 WPS 這樣的工具,不少實用功能都需要額外付費才能解鎖。它的打開方式很簡單,雙擊桌面圖標即可運行。它不會彈出主界面,而是默默駐留在系統托盤區,需要時雙擊圖標就…

SpringMVC注解與SpringCloudOpenFeign注解對比

1. 背景知識 梳理SpringMVC和SpringCloudOpenFeign常用注解后: Spring MVC中常用注解_筆記-CSDN博客Spring Cloud OpenFeign 常用注解_筆記-CSDN博客 這里對兩類注解做個對比。理解兩者定位(服務端 vs 客戶端)是掌握注解使用的關鍵&#x…

Linux 時間同步的流程

一、問題時間RTC時間、系統時間(UTC)和本地時間的關系如下:?RTC時間?(硬件時鐘):顯示為UTC時間格式:02:50:35/02:51:28由主板電池供電,獨立于系統運行?12通常存儲UTC時間(Linux默認配置&…

VSCode——python選擇解釋器消失的解決辦法

VSCode軟件的左下角 設置——檢查更新:

笛卡爾積規避:JOIN條件完整性檢查要點

笛卡爾積是數據庫查詢中的高風險操作,多表JOIN時缺失有效關聯條件會導致結果集指數級膨脹,引發?性能塌方?甚至系統崩潰?。以下是核心檢查策略及防御方案:一、笛卡爾積的致命影響??性能塌方?百萬級訂單表與千萬級用戶表缺失ON條件時&…

Vimba相機二次開發教程,基于Python

文章目錄安裝獲取圖像輔助數據Vimba 是由 Allied Vision 開發的一套軟件開發套件(SDK),主要用于控制和操作其工業相機產品。它提供了一套完整的 API 和工具,支持多種操作系統和編程語言,便于開發者快速集成相機功能到應…

電子測試行業軟件ATECLOUD與ETEST對比分析-納米軟件

在當今科技飛速發展的時代,電測行業對于自動化測試平臺的依賴程度日益加深。高效、精準的自動化測試平臺不僅能夠提升測試效率,還能確保產品質量。ATECLOUD 與 ETEST 作為電測行業中頗受矚目的自動化測試平臺,各自展現出獨特的優勢與特點。下…

自動化測試中的常見測試方法

自動化測試中的常見測試方法在自動化測試中,除了數據驅動(Data-Driven Testing),還有多種主流方法,每種方法適用于不同場景和需求。以下是常見的自動化測試方法分類及詳解:一、關鍵字驅動測試(K…

口語01-don‘t judge a book by its cover

Dont judge a book by its cover 不要以貌取人1 the most advanced thing2 stack3 right4 frantically5 be annoyed with sb6 Get your stuff off my desk7 But today I came to class and was running a few minutes late.8 take my seat:占我座位 / 坐我的位置9 s…

《Uniapp-Vue 3-TS 實戰開發》自定義預約時間段組件

這個組件可以直接在 uniapp 項目中使用,提供了 24 小時時段選擇功能,支持單選 / 多選、預設時段選擇、隨機選擇等功能。 html版本: <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="vi…