匿名內部類 this.val$的問題


  一天偶爾在網上找到一個jar包,反編譯后出現了如下的代碼:

public void defineAnonymousInnerClass(String name)
  {
    new Thread(name) {  //extra constructor argument "name"
      public void run() {
        System.out.println(this.val$name); //"this.val$"  is extra
      }
    }
    .start();
  }

  當看到紅色的部分時,我就糾結了。這是什么東西還能這么使用?后來在百度上搜索答案,卻始終不得答案。最終在google找到了答案。

      鏈接地址:http://www.mindfiresolutions.com/A-tip-on-val$-field-in-Java-decompiled-code-1725.php

   其實,我是被編譯器給玩了。這些代碼都是編譯器反編譯的時候自己添加上去的。

  第一個問題:匿名內部類要使用外面的參數,必須要加final。而代碼中卻沒有加。

  第二個問題:new Thread 這個類沒有帶參數的構造器。

  第三個問題:this.val$這種用法很怪異,val$是哪里來的。

  這些問題都是反編譯器給我們搞的鬼。

  我們在學習匿名內部類的時候都知道,匿名內部類要使用外部的變量,或者參數,這個變量和參數都必須是final類型。而且匿名內部類沒有構造器他的構造器是繼承於父類,這就還有一個問題就是那我們如何初始化內名內部類中的變量,只需要使用“{}”在里面初始化變量不需要任何修飾。再就是在匿名內部類中this表示當前對象,如果要使用外部類對象需要加上Outclass.this這才是外部對象。

  所以以上代碼我們做如下修改:

public void defineAnonymousInnerClass(final String name)//參數加上final
  {
    new Thread() {  //額外的參數去掉
      public void run() {
        System.out.println(name); //"this.val$"  多余的去掉
      }
    }
    .start();
  }

  這時我們就可以正常運行了,其實都是編譯器搞的鬼。

  這是我第一次寫博客,如有寫的不對的地方請各位大俠們指教。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM