1. 程式人生 > >內部類訪問外部類的區域性變數只能是final

內部類訪問外部類的區域性變數只能是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