一天偶爾在網上找到一個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();
}
這時我們就可以正常運行了,其實都是編譯器搞的鬼。
這是我第一次寫博客,如有寫的不對的地方請各位大俠們指教。
