java內部類所訪問的區域性變數為什麼要加final
如果我們在一個類中宣告一個內部類,在這個內部類中訪問了原來類中的區域性變數,那麼這個區域性變數必須在原來的類中宣告成final,如圖:
class A
{
final int a=1;;
class B
{
int b=a;
}
}
這是為什麼呢?
答案是,因為在原來的類中執行的函式之類的東西和在內部類中執行的東西是非同步進行的,所以原來類中的函式執行完畢,內部類中的可能還沒有執行完畢,這時候如果我們用什麼方法改變了原來類中區域性變數的值,可能會對內部類中執行的東西造成影響,因此,我們要宣告成final,這樣,原來類的區域性變數一經賦值便不能被更改,就不會影響內部類中的東西了。
相關推薦
java內部類所訪問的區域性變數為什麼要加final
如果我們在一個類中宣告一個內部類,在這個內部類中訪問了原來類中的區域性變數,那麼這個區域性變數必須在原來的類中宣告成final,如圖: class A { final int a=1;; class B { int b=a; } } 這是為什麼呢? 答案是,因為在原
為什麼內部類訪問區域性變數需要加final修飾?
先看一段程式碼: public void myRun(final String name){ new Runnable() { public vo
Java內部類訪問區域性變數時的final問題
JAVA用了也快三年了,內部類訪問區域性變數的情況也沒少遇到。也一直知道要給變數加個final修飾符,不然通過不了編譯。但一直也沒深究過為什麼要加。昨天好奇的上網查了下,並翻閱了下相關的書籍(Core Java 8th),終於算是搞明白了,在這裡簡單說明下。 說先我們來
Java內部類詳解 及 區域性內部類和匿名內部類只能訪問區域性final變數的原因
說起內部類這個詞,想必很多人都不陌生,但是又會覺得不熟悉。原因是平時編寫程式碼時可能用到的場景不多,用得最多的是在有事件監聽的情況下,並且即使用到也很少去總結內部類的用法。今天我們就來一探究竟。下面是本文的目錄大綱: 一.內部類基礎 二.深入理解內部類 三.內部類的使用場景和好處
匿名內部類可以訪問的變數---靜態成員變數和final修飾的區域性變數
在學習多執行緒的時候用到了匿名內部類,匿名內部類可以訪問static靜態成員變數或者final修飾的區域性變數。 匿名內部類在編譯之後會生成class檔案,比如Test內的第一個匿名內部類編譯之後就是Test$1.class; 匿名內部類中訪問的final修飾的區域性變數在生成Test$1.c
內部類引用外部類的區域性變數要用final修飾
為什麼內部類引用外部類的區域性變數時,此變數要用final修飾 程式碼 public void test() { final int i = 3; run
區域性內部類引用外部類中的區域性變數必須是final屬性的!
如例中所示,聲明瞭一個區域性內部類TimerPrint,這個類中的方法引用了一個區域性變數testTxt,必須宣告為final!!why? 邏輯上:因為該內部類出現在一個方法的內部,但實際編譯時,內部類編譯為Outer$1TimerPrint.class,這說明,外
java 內部類如何訪問外部類的同名屬性
package com.card; /** * 內部類如何訪問外部類的同名屬性 * * by Zhiwang Zhang on 2014年7月18日 */ public class Test95 { private int age; public sta
Java內部類之訪問許可權和編譯效率
問題1: elementData的註釋的意思是,非私有化以簡化巢狀類的訪問,但巢狀類可以透明地訪問外圍類的所有成員,如何理解這裡的簡化? 為什麼不宣告為private呢? 通過檢視反編譯檢視位元組碼解決了問題: 虛擬機器不知道類的分組情況,會在類中提供
Java內部類的訪問與呼叫
內部類分為成員內部類、靜態巢狀類、方法內部類、匿名內部類。 幾種內部類的共性: A、內部類仍然是一個獨立的類,在編譯之後會內部類會被編譯成獨立的.class檔案,但是前面冠以外部類的類命和$符號。 B、內部類不能用普通的方式訪問。內部類是外部類的一個成員,因此內部類可以自由地訪
匿名類訪問區域性變數時,為什麼區域性變數必須加final
匿名內部類就是在物件的方法體內部定義的類。我們都知道方法中的匿名內部類是能夠訪問同一個方法中的區域性變數的,但是為什麼區域性變數要加上一個final呢? 原因就是因為匿名內部類物件的生命週期可能會超過區域性變數的生命期。區域性變數的生命週期是當該方法被呼叫時,該方法中的區
java中內部類訪問區域性變數為什麼要定義區域性變數為final
因為方法內定義的變數是區域性變數,離開該方法,變數就失去了作用,也就會自動被消除,而內部類卻不會離開它所在方法就失去作用,它有更廣的生命週期,下面通過一個例項加以說明: 如例中所示,在外部類Outer中聲明瞭一個內部類TimerPrint,這個類中的方法引用了方法start
java:面向物件-區域性內部類訪問區域性變數的問題
* 區域性內部類訪問區域性變數必須用final修飾* 區域性內部類在訪問他所在方法中的區域性變數必須用final修飾,為什麼? 因為當呼叫這個方法時,區域性變數如果沒有用final修飾,他的生命週期和方
為什麼java內部類訪問區域性變數必須宣告為final?
先丟擲讓我疑惑了很久的一個問題 程式設計時,線上程中使用區域性變數時候經常編譯器會提示:區域性變數必須宣告為final package test; publicclass ThreadTest { publicvoid function(Stri
Java進階——Java 區域性內部類訪問區域性變數為什麼必須加final關鍵字
Java 區域性內部類訪問區域性變數為什麼必須加final關鍵字 疑問 在Java中,區域性內部類如果呼叫了方法中的變數,那麼該變數必須申明為final型別,如果不申明,則編譯就會出錯。 這裡的內部類指的是方法內部類或匿名內部類,不包含靜態內部類和成員內部類
【Java】從內部類中訪問變數,需要宣告為final
Cannot refer to a non-final variable ‘result’ inside an inner class defined in a different method 從內部類中訪問變數’result’,需要宣告為final 這
內部類訪問區域性變數的時候,為什麼變數必須加上final修飾
這裡的區域性變數就是在類方法中的變數,能訪問方法中變數的類當然也是區域性內部類了。 我們都知道,區域性變數在所處的函式執行完之後就釋放了,但是內部類物件如果還有引用指向的話它是還存在的。例如下面的程式碼: class Outer{
為什麼匿名內部類和區域性內部類只能訪問被final修飾的區域性變數?
匿名內部類是形如下面程式碼中的類(Inner): 匿名內部類必須繼承一個父類或實現一個介面,但最多隻能實現一個介面。 上圖中,匿名內部類的父類就是Outer類。 而區域性內部類是定義在方法中、程式碼塊中、構造器中的類。 形如下圖中的類:
Java非靜態內部類和靜態內部類,訪問父類的非靜態和靜態成員變數及成員函式
public class Test { // Not static variable private int mAge = 10; // Static variable private static int mId = 1; // Single inst
Java內部類引用外部類中的區域性變數為何必須是final問題解析
今天編寫一個多執行緒程式,發現在方法內定義內部類時,如果內部類呼叫了方法中的變數,那麼該變數必須申明為final型別,百思不得其解,後來想到應該是生命週期的原因,因為方法內定義的變數是區域性變數,離開該方法,變數就失去了作用,也就會自動被消除,而內部類卻不會