為什麼匿名內部類和區域性內部類只能訪問被final修飾的區域性變數?
匿名內部類是形如下面程式碼中的類(Inner):
匿名內部類必須繼承一個父類或實現一個介面,但最多隻能實現一個介面。
上圖中,匿名內部類的父類就是Outer類。
而區域性內部類是定義在方法中、程式碼塊中、構造器中的類。
形如下圖中的類:
那麼為什麼匿名內部類和區域性內部類只能訪問被final修飾的區域性變數呢?
根本原因是內部類的生命週期可能會超過區域性變數的生命週期。區域性變數的生命週期是當呼叫方法f()的時候,java虛擬機器會將區域性變數壓入棧中(即區域性變數產生),當方法f()執行結束後,java虛擬機器就會將區域性變量出棧(即區域性變數銷燬);但此時,內部類物件可能還存在,如果內部類物件此時去訪問區域性變數,那麼就會出問題。解決辦法就是把匿名內部類或區域性內部類要訪問的區域性變數複製一份作為內部類物件的成員變數;這樣當局部變數在棧中銷燬以後,內部類還能訪問區域性變數。但是這樣做會有一個問題,那就是必須時時刻刻保證複製的那一份區域性變數的值和原來的區域性變數的值相同,但是這樣做是很困難的;於是,java中乾脆就不允許內部類要訪問的區域性變數的值發生改變,也就是將這些區域性變數用final修飾。(用final修飾的區域性變數的值不能改變,只能是初始值。)
相關推薦
為什麼匿名內部類和區域性內部類只能訪問被final修飾的區域性變數?
匿名內部類是形如下面程式碼中的類(Inner): 匿名內部類必須繼承一個父類或實現一個介面,但最多隻能實現一個介面。 上圖中,匿名內部類的父類就是Outer類。 而區域性內部類是定義在方法中、程式碼塊中、構造器中的類。 形如下圖中的類:
java中的內部類和靜態內部類
以下程式執行結果為 public class Test { public class A{ public String test="A"; } public static class B{ public Strin
java內部類和靜態內部類的區別及分析
java內部類:成員內部類,區域性內部類,靜態內部類匿名內部類,重點介紹成員內部類,和靜態內部類 成員內部類特點: 1,成員內部類中,不能定義靜態成員,但是可以宣告為static final 2,成員內部類,可以訪問所有的外部成員, 3,在內部類中,直接訪問外部變數名
Java非靜態內部類和靜態內部類,訪問父類的非靜態和靜態成員變數及成員函式
public class Test { // Not static variable private int mAge = 10; // Static variable private static int mId = 1; // Single inst
靜態內部類和成員內部類的區別
如果你不需要內部類物件與其外圍類物件之間有聯絡,那你可以將內部類宣告為static。這通常稱為巢狀類(nested class)。Static Nested Class是被宣告為靜態(static)的內部類,它可以不依賴於外部類例項被例項化。而通常的內部類需要在外部類例項化後才能例項化。想要理解stat
Java中內部類和靜態內部類的區別
內部類和靜態內部類 示例 public class OuterClass { private int numPrivate = 1; public int numPublic = 2; public static int numPublicStatic = 3; private
jvm 調整tomcat的堆內存和常駐內存catalina.sh
需要 new opts 回收 maxperm awt utf msi 內存 4.2 性能優化 tomcat性能取決於你的內存大小 上策:優化代碼 中策:jvm優化機制 垃圾回收機制 把不需要的內存回收 優化jvm--優化垃圾回收策略 優化catalina.sh配置文件
JAVA之堆內存和棧內存的差別
名稱 pre 垃圾 HR num long ews 內存空間 RR 歡迎轉載。請附上出處: http://blog.csdn.net/as02446418/arti
js棧內存和堆內存的區別
就是 棧內存 不能 定義 存在 占用內存 銷毀 asc 們的 首先JavaScript中的變量分為基本類型和引用類型。基本類型就是保存在棧內存中的簡單數據段,而引用類型指的是那些保存在堆內存中的對象。1、基本類型 基本類型有Undefined、Null、B
hibernate_day04_13_HQL多表查詢(內連線和迫切內連線)
//1 建立query物件 Query query = session.createQuery("from Customer c inner join c.setLinkMan"); //2 呼叫方法得到結果 List list = query.l
Hibernate框架的內連線和迫切內連線
public class HQLTest { @Test public void fun1(){ Session session=null; Transaction tx=null; try {
靜態變量和成員變量的區別、final修飾特點、創建對象的內存圖、靜態內存圖
mage 調用 back gif nal 出現 http 消失 區別 靜態變量和成員變量的區別* 靜態變量也叫類變量 成員變量也叫對象變量* A:所屬不同 * 靜態變量屬於類,所以也稱為為類變量 * 成員變量屬於對象,所以也稱為實例變量(對象變量)* B:內存中位置不
通過FTP服務端來實現匿名用戶和基本用戶的訪問,可以實現文件上傳和下載。通過web網站來瀏覽內容
ges 用戶 分享圖片 size 下載 mark col term http 通過FTP服務端來實現匿名用戶和基本用戶的訪問,可以實現文件上傳和下載。通過web網站來瀏覽內容
局部內部類的成員變量被final修飾才能被局部內部類的方法所訪問
() public 局部內部類 所有 方法的參數 clas 類對象 訪問 保持 public class Demo { public static void main(String[] args) { //都能正確運行,因為方法彈棧了,這裏思考的問
Java內部類詳解 及 區域性內部類和匿名內部類只能訪問區域性final變數的原因
說起內部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫程式碼時可能用到的場景不多,用得最多的是在有事件監聽的情況下,並且即使用到也很少去總結內部類的用法。今天我們就來一探究竟。下面是本文的目錄大綱: 一.內部類基礎 二.深入理解內部類 三.內部類的使用場景和好處
匿名內部類和區域性內部類中只能訪問final變數的原因
在一個方法中,如果建立一個匿名內部類,並且在內部類中藥訪問方法的引數,我們必須將該引數用final進行修飾才能訪問,這個的原因主要是由於方法和內部類的生命週期不相同導致的。 當我們執行一個帶參的方法時,在該方法的呼叫棧中將生成一個區域性變數(即該引數),如果在該方法中建立了
匿名內部類可以訪問的變數---靜態成員變數和final修飾的區域性變數
在學習多執行緒的時候用到了匿名內部類,匿名內部類可以訪問static靜態成員變數或者final修飾的區域性變數。 匿名內部類在編譯之後會生成class檔案,比如Test內的第一個匿名內部類編譯之後就是Test$1.class; 匿名內部類中訪問的final修飾的區域性變數在生成Test$1.c
JAVA中區域性內部類和匿名內部類的特點和作用?
Java 內部類 分四種:成員內部類、區域性內部類、靜態內部類和匿名內部類。 1、成員內部類: 即作為外部類的一個成員存在,與外部類的屬性、方法並列。 注意:成員內部類中不能定義靜態變數,但可以訪問外部類的所有成員。 public class Outer{ privat
成員內部類、靜態內部類、區域性內部類和匿名內部類的理解
說起內部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫程式碼時可能用到的場景不多,用得最多的是在有事件監聽的情況下,並且即使用到也很少去總結內部類的用法。今天我們就來一探究竟。下面是本文的目錄大綱: 一.內部類基礎 二.深入理解內部類 三.內部類的使用場景和好處 四.常見的與
Java之區域性內部類和匿名內部類的區別詳解(附原始碼)
前言 前面提到過,可以在程式碼塊裡建立內部類,典型的方式是在一個方法體裡面建立。區域性內部類不能有訪問說明符,因為它不是外圍類的一部分;但是他可以訪問當前程式碼塊內的常量,以及此外圍類