Java 內部類及其原理

来源:https://www.cnblogs.com/hujingnb/archive/2019/01/05/10181621.html
-Advertisement-
Play Games

Java中實現內部類 內部類相信大家都用過很多次了,就不說它是怎麼用的了。 內部類 1.成員內部類 需要註意的是, 當成員內部類擁有和外部類同名的成員變數或這方法時, 預設情況下訪問的是內部類的成員, 如要訪問外部類的同名成員, 需要使用以下形式: 內部類是依附外部類而存在的, 也就是說要創建成員內 ...


Java中實現內部類

Java 內部類

 

內部類相信大家都用過很多次了,就不說它是怎麼用的了。

內部類

1.成員內部類

Java 內部類

 

需要註意的是, 當成員內部類擁有和外部類同名的成員變數或這方法時, 預設情況下訪問的是內部類的成員, 如要訪問外部類的同名成員, 需要使用以下形式:

外部類.this.成員變數
外部類.this.成員方法

內部類是依附外部類而存在的, 也就是說要創建成員內部類的對象,前提是創建一個外部類的對象,創建成員內部類的方式如下:

new Main().new Inner();

成員內部類可以擁有private訪問許可權、protected訪問許可權、public訪問許可權、預設訪問許可權。如用private修飾,則只能在外部類的內部訪問。

2.局部內部類

局部內部類是定義在一個方法或作用域中的類,它的訪問許可權僅限於方法內或作用域內。

Java 內部類

 

局部內部類也可以返回,像這樣:

Java 內部類

 

3.匿名內部類

匿名內部類應該是我們平常使用最多的了,如下麵創建線程:

Java 內部類

 

匿名內部類在編譯的時候有系統自動起名:Main$1

匿名內部類是沒有構造器的類,大部分用於繼承其他類或實現介面,並不需要增加額外的方法,只是對繼承方法的實現或是重寫

4.靜態內部類

靜態內部類也是定義在另一個類裡面的類,只不過在類前加上了static。靜態內部類是不需要依賴於外部類的,與靜態成員變數類似。

Java 內部類

 

外部創建該靜態類時可以如下創建:

Main.Inner mi = new Main Inner();

內部類實現原理

內部類為什麼能夠訪問外部類的成員?

定義內部類如下:

Java 內部類

 

使用javap命令進行反編譯。

編譯後得到Main.class Main$Inner.class兩個文件,反編譯Main$Inner.class文件如下:

Java 內部類

 

可以看到,內部類其實擁有外部類的一個引用,在構造函數中將外部類的引用傳遞進來。

匿名內部類為什麼只能訪問局部的final變數?

其實可以這樣想,當方法執行完畢後,局部變數的生命周期就結束了,而局部內部類對象的生命周期可能還沒有結束,那麼在局部內部類中訪問局部變數就不可能了,所以將局部變數改為final,改變其生命周期。

編寫代碼如下:

Java 內部類

 

這段代碼編譯為Main.class Main$1.class兩個文件,反編譯Main$1.class文件如下:

Java 內部類

 

可以看到,java將編譯時已經確定的值直接複製,進行替換,將無法確定的值放到了內部類的常量池中,併在構造函數中將其從常量池取出到欄位中。

可以看出,java將局部變數m直接進行複製,所以其並不是原來的值,若在內部類中將m更改,局部變數的m值不會變,就會出現數據不一致,所以java就將其限製為final,使其不能進行更改,這樣數據不一致的問題就解決了。

匿名內部類為什麼訪問外部類成員欄位不用final?

上面說了,final關鍵字是為瞭解決數據不一致的問題,因為內部類中存有外部類的引用,所有對外部類中欄位的修改都會真實的反映到外部類實例本身,所以不需要用final來修飾。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、背景 為了達到創1的結課要求,並且實現以前就憧憬過的網站想法,我在什麼都沒有準備的情況下開始了建設網站的腳步。腦袋一熱就行動,也許我就這樣子的莽撞,造成我後來撞得滿頭包。 二、預備知識 開始的時候我只有學了一個學期的c語言,java,還有正在學習數據結構,可是對我建設網站沒有什麼幫助。不過當時粗 ...
  • 個人博客原文: "迪米特法則" 設計模式六大原則之五:迪米特法則。 簡介 姓名 :迪米特法則 英文名 :Law of Demeter 小名 :最少知識原則 小名英文名 :Least Knowledge Principle 價值觀 :媽媽說不和陌生人說話 個人介紹 : 1. Each unit sho ...
  • 系統介紹: 1.系統採用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC瀏覽器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通java web(非maven, 附贈pom.xml文件) 資料庫:mysql 3.開發工具:my ...
  • 當對象之間存在一對多的關係時,若需要進行對象之間的通知,則可使用觀察者模式 介紹 觀察者模式屬於行為型模式,當一個對象的狀態發生改變時,若我們想通知其他對象,此時可通過觀察者模式來進行解決。 類圖描述 代碼實現 1、定義抽象觀察者 2、定義觀察者管理類 3、定義具體觀察者 4、上層調用 總結 觀察者 ...
  • (1)首先進入cmd,輸入pip install yagmail (2)思路:1 、連接伺服器:yagmail.SMTP(郵箱賬號,郵箱密碼,郵箱伺服器地址,郵箱伺服器埠) 2 、準備正文內容:contents="XXXXXXXX" 3 、發送郵件:yag.send(收件人列表,郵件主題,郵件內容 ...
  • 首先JVM的記憶體結構包括五大區域: 程式計數器、虛擬機棧、本地方法棧、方法區、堆區。其中程式計數器、虛擬機棧和本地方法棧3個區域隨線程啟動與銷毀, 因此這幾個區域的記憶體分配和回收都具有確定性,不需要過多考慮回收的問題。而Java堆區和方法區則不一樣,這部分記憶體的分配和回收是動態的,正式垃圾回收需要關 ...
  • import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;... ...
  • 哎,自從有了女朋友,自己的業餘時間少了好多,連博客都忘了更新了,差點忘了一個月! 但是好在,沒有忘記寫代碼,而且還解決了一個困擾好久的問題(其實是解決了一半,就在最後一個函數里,因為藍圖比較複雜所以還沒弄清) 今晚剛見了她媽回來,可能這次要來真的了! 今年可能會結婚,也可能會要孩子吧! 公司的項目也 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...