這兩天寫程式的過程中遇到了一個問題:參數必須是終態的(final),否則程式報錯!思考良久還是想不通,去網上搜尋了半天也沒有找到原因。最後還是在某QQ群裡面得到了一位高人的指點,然後自己才找到了一些相關資訊。雖然現在還是不太懂,但好在找到了方向。暫且記下吧!
測試代碼:
Code:
- import java.awt.Image;
-
- public class Test
- {
- //public void outputA(Image image) //錯誤碼
- public void outputA(final Image image)
- {
- new TestB(){
- public void output()
- {
- System.out.println(image.getWidth(null));
- }
- };
- }
- }
-
- class TestB
- {
- public void outputB(Image image)
- {
- int width = image.getWidth(null);
- }
- }
如上所示,如果將第6行的代碼換成第5行(即注釋第6行並取消注釋第5行),程式的11行處就會提示:Cannot refer to a non-final variable image inside an inner class defined in a different method。
如此一來,這個參數就變成了final參數。關於這,我找到了一點兒資訊:Java允許我們將參數設成final屬性,方法是在參數列表中對它們進行適當的聲明。這意味著在這個方法的內部,我們不能改變該參數指向的東西(對象)。
網友告訴我:
【
Thinking in java裡面的說法(唯一正確的說法):
如果定義一個匿名內部類,並且希望它使用一個在其外部定的對象,那麼編譯器會要求其參數引用是final的。
說明一下:
1.匿名內部類肯定是局部內部類(在一個方法裡面定義的內部類),因為在java中,語句必須寫在方法裡,而匿名內部類其實就是一條特殊的語句;
2.外部給定的對象就是所有外來的對象:外部方法的形參、局部變數、基本類型或自訂類型等。
】
我從網上下載了一個 thinkinjava.pdf,開啟之後沒有找到上面的內容。呵呵,暫且放下,留待以後研究吧!