內部類訪問外部類的區域性變數只能是final
public class InnerCalss { private String name = "張三"; @Test public void out(){ String gender = "娜娜"; class Inner{ int in = 1; public void show(){ System.out.println(name); System.out.println(gender); } } Inner inner = new Inner(); inner.show(); } }
對於上面的例項,發現沒有任何錯誤,但是如果再修改gender屬性的值,會發現報錯
告訴我們,gender已經變成了final型別的資料,不允許被修改,
也就是說區域性內部類中的訪問外部 類的區域性變數的時候,該區域性變數必須是final修飾的。
但是,為什麼會這樣呢?
寫一個例子證明這個問題
class Out{ public static void main(String[] args) { InnerCalss innerCalss = new InnerCalss(); innerCalss.test(); innerCalss.fast.print(); } } public class InnerCalss { public Fast fast = null; public void test(){ int age = 100; class Inner implements Fast{ @Override public void print() { System.out.println(age); } } fast = new Inner(); } } interface Fast{ public void print(); }
區域性內部類的生命週期應該在所在方法的執行彈棧而結束的,但是在這個例項中,內部類在方法執行完畢後還被其他引用,所以不會消亡,在這個內部類中引用者區域性方法的變數,該變數如果不是final型別的,則會隨著方法的消亡而消亡,那麼在後期呼叫內部類方法的時候就找不到該變數,引起異常,所以在這裡必須強制性將被呼叫的區域性變數改成final型別
相關推薦
內部類訪問外部類的區域性變數只能是final
public class InnerCalss { private String name = "張三"; @Test public void out(){ String gender = "娜娜";
匿名內部類訪問外部類方法中的區域性變數
匿名內部類不能訪問外部類方法中的區域性變數,除非變數被宣告為final型別 1. 這裡所說的“匿名內部類”主要是指在其外部類的成員方法內定義,同時完成例項化的類,若其訪問該成員方法中的區域性變數,區域性變數必須要被final修飾。 2. 原因是編
內部類訪問外部類變數的問題
package test; public class TestFinal { //只有定義成 final User user 才不會報錯為什麼? public void test( User user) { (new Thread(
靜態內部類訪問外部類靜態變數的原因分析
寫一個類用來判斷是否靜態類和非靜態類的能不能訪問外部的靜態變數和非靜態變數,答案是靜態內部類可以訪問靜態變數,而不可以訪問類的非靜態內部類。 原因是:當一個靜態內部類被使用的時候,它的外部類一定已經被載入了(這個可以參考類載入機制),外部類載入了以後它的靜態變數才會放到
Python沒有"內部類"這一說法,內部類訪問外部類例項的成員,需要將外部類例項作為引數傳入。
除了傳outter的例項做為引數外,似乎沒有簡單的方式了。 內部類本身是不知道自己被哪個外部類包含的,也就是說語言中沒有提供訪問外部類的關鍵字或者方法,因此除了使用的語法有一點點不同外,其他和外部類沒有什麼區別的。 就是傳遞引數了 class Outter: nam
“全棧2019”Java第七十二章:靜態內部類訪問外部類成員
難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第七十二章:靜態內部類訪問外部類成員 下一章 “全棧2019”Java第七十三章:外部類裡多
C++ 實現內部類訪問外部類
2013年12月10日 15:18:17 meilinbaobei 閱讀數:720 個人分類: c++
“全棧2019”Java第六十九章:內部類訪問外部類成員詳解
難度 初級 學習時間 10分鐘 適合人群 零基礎 開發語言 Java 開發環境 JDK v11 IntelliJ IDEA v2018.3 文章原文連結 “全棧2019”Java第六十九章:內部類訪問外部類成員詳解 下一章
內部類訪問外部類方法中的引數-使用final
publicsynchronized<T extendsMetricsSource> T register(finalString name,finalString desc,final T source){if(this.monitoring){ reg
內部類引用外部類的區域性變數要用final修飾
為什麼內部類引用外部類的區域性變數時,此變數要用final修飾 程式碼 public void test() { final int i = 3; run
區域性內部類引用外部類中的區域性變數必須是final屬性的!
如例中所示,聲明瞭一個區域性內部類TimerPrint,這個類中的方法引用了一個區域性變數testTxt,必須宣告為final!!why? 邏輯上:因為該內部類出現在一個方法的內部,但實際編譯時,內部類編譯為Outer$1TimerPrint.class,這說明,外
類中內部類中的方法訪問外部類中變數的示例
class Day10_11 { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.print()
【重點】內部類初始化以及訪問外部類變數
成員內部類可以隨便訪問成員變數, 方法的內部類訪問方法的成員變數,成員變數必須是final型別 package com.xiaozhi.interclazz; class Outer { private int x = 3; class Inner { in
Java內部類引用外部類中的區域性變數為何必須是final問題解析
今天編寫一個多執行緒程式,發現在方法內定義內部類時,如果內部類呼叫了方法中的變數,那麼該變數必須申明為final型別,百思不得其解,後來想到應該是生命週期的原因,因為方法內定義的變數是區域性變數,離開該方法,變數就失去了作用,也就會自動被消除,而內部類卻不會
java中內部類訪問區域性變數為什麼要定義區域性變數為final
因為方法內定義的變數是區域性變數,離開該方法,變數就失去了作用,也就會自動被消除,而內部類卻不會離開它所在方法就失去作用,它有更廣的生命週期,下面通過一個例項加以說明: 如例中所示,在外部類Outer中聲明瞭一個內部類TimerPrint,這個類中的方法引用了方法start
JavaSE8基礎 內部類可以訪問外部類的私有成員
外部 alt ner dem testin pub out .sh logs os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0) 代碼:
當內部類和外部類存在同名成員時,如何訪問外部類的成員
rgs sta 內部類 public func main 外部 str print 打印結果是什麽 答案2public class Test { public static void main(String[] args) { Outer.Inner on = ne
內部類和外部類之間互相訪問
2009年02月04日 19:17:00 jierui001 閱讀數:13704 個人分類: 摘抄
內部類,外部類成員的相互訪問 及內部類物件的建立
class Human { private String word = "We "; protected void en() { System.out.print("yes, "); } class chineseBrain //一內部類,可
java 內部類如何訪問外部類的同名屬性
package com.card; /** * 內部類如何訪問外部類的同名屬性 * * by Zhiwang Zhang on 2014年7月18日 */ public class Test95 { private int age; public sta