java內部類中的final參數問題

來源:互聯網
上載者:User

這兩天寫程式的過程中遇到了一個問題:參數必須是終態的(final),否則程式報錯!思考良久還是想不通,去網上搜尋了半天也沒有找到原因。最後還是在某QQ群裡面得到了一位高人的指點,然後自己才找到了一些相關資訊。雖然現在還是不太懂,但好在找到了方向。暫且記下吧!

測試代碼:

Code:
  1. import java.awt.Image;  
  2.   
  3. public class Test  
  4. {  
  5.     //public void outputA(Image image) //錯誤碼  
  6.     public void outputA(final Image image)  
  7.     {  
  8.         new TestB(){  
  9.             public void output()  
  10.             {  
  11.                 System.out.println(image.getWidth(null));  
  12.             }  
  13.         };  
  14.     }  
  15. }  
  16.   
  17. class TestB  
  18. {  
  19.     public void outputB(Image image)  
  20.     {  
  21.         int width = image.getWidth(null);  
  22.     }  
  23. }  

如上所示,如果將第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,開啟之後沒有找到上面的內容。呵呵,暫且放下,留待以後研究吧!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.