<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    ice world

    There is nothing too difficult if you put your heart into it.
    posts - 104, comments - 103, trackbacks - 0, articles - 0
    標題有點長,可能有點語病,先別管那么多!
    首先看下面的這段代碼:
    public class LocalInnerClassTest{
          
    public static void main(String[] args){
             Outer obj
    =new Outer();          //生成一個外部類對象
             SuperInner si=obj.outer();        //調用外部類中的outer()方法,返回一個SuperInner類型對象賦值給si
            si.m1();             //調用被覆蓋的方法m1(),輸出:Inner's m1() 20
         }

    }


    /**
    *定義一個接口SuperInner,內部定義一個抽象方法m1(),無返回類型
    */

    interface SuperInner{
         
    public void m1();
    }


    /**
    *定義一個類Outer,內部只定義一個方法outer(),返回類型為SuperInner
    */

    class Outer{
         
    public SuperInner outer(){
            
    int a=10;                   //方法中定義一個局部變量a,并賦值為10
            final int b=20;          //再定義一個final局部變量b,初始化為20

            
    class Inner implements SuperInner{              //在outer()方法中定義一個局部內部類Inner,實現接口SuperInner
               public void m1(){    //類中只有一個覆蓋接口SuperInner的方法m1()
                  System.out.println("Inner's m1()"+a);    //編譯報錯
                  System.out.println("Inner's m1() "+b);    //編譯通過,輸出:Inner's m1() 20
               }

           
     }

            
    return new Inner();
         }

    }




    我們先從主方法開始看代碼的執行順序,先生成一個Outer類對象obj,obj調用本類中方法outer();程序開始跳到outer()方法內執行程序語句,先后生成局部變量a和b,再定義一個局部內部類Inner,返回一個SuperInner類型的對象。將返回的SuperInner類型對象地址傳給SuperInner類型對象si。si再調用m1()方法,因為已經在局部內部類中覆蓋了接口中的m1()方法,所以將調用局部內部類中的m1()方法,程序跳到局部內部類中m1()方法內執行程序語句,先輸出一段字符串和a,結果編譯報錯,先 將這條程序語句隱藏,執行下面的語句,你會發現編譯通過而且輸出Inner's m1() 20!

    為什么會這樣呢?大家都知道局部變量僅僅在一個范圍內有效,在方法調用完就被內存釋放,在Outer類對象obj調用outer()方法時,a和b才產生,調用結束后被內存釋放,那么b這個值也就不復存在了,為什么還會輸出20呢?難道局部變量被final修飾就不會被內存釋放而保留?

    其實有部分操作對于程序員是透明的,那是JAVA語言開發者的小把戲,在定義a和b 時JVM(JAVA虛擬機)做了程序員看不到的操作,他將b拷貝了一份給局部內部類,也就是說JVM在局部內部類中定義了一個final int b=20;這個操作程序員是不知道的!當調用m1()方法時輸出的20并不是原來outer()方法中定義的b,而僅僅是JVM拷貝的一個副本。那么為什么a沒被打印出呢?那是因為JVM并沒有拷貝它,因為沒有final修飾,說明它可以被修改,如果把a 改為 a++,此時JVM就不知道拷貝a還是a++了,所以對于無final修飾的局部變量JVM是不會拷貝傳給局部內部類的,自然無法打輸出!

    Feedback

    # re: Java中局部內部類可以訪問它所在方法中定義的final修飾的局部變量的合理解釋  回復  更多評論   

    2011-09-29 08:08 by 分公司
    你說的拷貝我有點疑問,感覺這個是常量池的原因吧
    主站蜘蛛池模板: 午夜免费不卡毛片完整版| 91麻豆最新在线人成免费观看| 免费国产黄线在线观看| 亚洲国产午夜精品理论片| 亚洲毛片在线免费观看| 亚洲福利一区二区三区| 美女网站免费福利视频| 亚洲免费福利视频| 日韩中文字幕精品免费一区| 亚洲一卡2卡4卡5卡6卡在线99 | 91亚洲一区二区在线观看不卡| 暖暖免费日本在线中文| 亚洲综合激情另类小说区| 最近高清中文字幕无吗免费看| 亚洲粉嫩美白在线| 四虎影视永久免费观看| 国产一级在线免费观看| 亚洲国产国产综合一区首页| 无码人妻精品中文字幕免费东京热| 亚洲1234区乱码| 四虎影院永久免费观看| 中文字幕无码毛片免费看| 亚洲视频精品在线| 免费无码又黄又爽又刺激| 免费国产va在线观看| 亚洲毛片αv无线播放一区| 足恋玩丝袜脚视频免费网站| 中中文字幕亚洲无线码| 亚洲精品456播放| 久久久久久一品道精品免费看| 亚洲人成网站在线观看播放青青| 免费看大美女大黄大色| 亚洲精品视频免费 | 免费一级毛片在线播放不收费| 国产成人高清精品免费观看| 2022年亚洲午夜一区二区福利| 白白国产永久免费视频| 永久免费不卡在线观看黄网站| 中国china体内裑精亚洲日本| 亚洲精品国产电影| 无码精品A∨在线观看免费|