2013-06-24 46 views
-1

我很好奇爲什麼我們不能在同一個方法中聲明的匿名內部類中使用方法的局部變量。這個變量在方法完成後從調用堆棧中移除,而對內部類的引用可能繼續存在的原因對我來說似乎不合理。在內部類中使用局部變量

我的疑惑:

  1. 如果該類不能超過什麼能不讓它使用局部變量的原因,這種方法之外實例化?

  2. 爲什麼最終讓參數變得可以接受?這些也不在調用堆棧上嗎?

  3. 由於內部類無法在方法外部實例化,因此如何將內部類的引用傳遞給另一個方法,以及如何將其分配給另一個方法中的引用變量?它可以分配給什麼類型的變量?

下面是一個例子:

public class MyOuter2 { 

    int num = 1;     //Outer instance variable 

    void doStuff(final int x) {  //Outer instance Method with final variable 

//  void doStuff(int x) {  //Final removed, compiler error 


     class MyInner {     //Outer Method inner class 

      public void seeOuter() { 
       System.out.println("Outer num=" + num); 
       System.out.println(x); 
      } 

     } 

     MyInner inner = new MyInner(); 
     inner.seeOuter(); 
     readInnerObject(inner);    //any method that pass inner object 

    } 




    public void readInnerObject(Object i){ 

     MyOuter2 outer = new MyOuter2(); // how to receive it??????????? 

     } 

    public static void main(String args[]) { 

     MyOuter2 o = new MyOuter2(); 
     o.doStuff(2); 
    } 

} 
+1

請給我們一個乾淨的格式的代碼示例。通過讓我們努力瞭解您的樣品,您正在拍攝自己的腳。 –

回答

1

在內部類外層方法之後可以運行該代碼已經退出,並且局部變量調用堆棧上不再存在。因此,需要製作一份其價值觀的副本。在內部類實例化時執行此操作最容易理解和實現。

如果類不能在方法外部實例化,那麼可能是因爲不讓它使用局部變量?

因爲內部類的代碼運行時,調用堆棧上可能不再存在局部變量。

爲什麼使參數最終可以接受?這些不與堆棧?

因爲可以複製這些值而不必擔心它們何時被複制。

如果傳遞給其他方法的內部類的引用將被分配給哪個類型的變量如果內部類不能在方法外實例化?

您可以通過超類或內部類擴展或實現的接口來引用內部類。

+0

謝謝安迪 您的帖子清除了很多我的疑惑 – Anshul

+0

不客氣,歡迎來到StackOverflow。您可以通過單擊左側的複選標記來接受一個您認爲最有用的答案。您可以通過單擊左側的向上三角形來獲得多個您認爲有用的答案。 –

0

要回答問題3,您可以MyInner其他方法無法通實例,因爲他們不知道MyInner類是什麼。在更實際的例子中,MyInner將實現一個接口或擴展一些超類。這將允許您將MyInner的實例傳遞給其他方法,方法是將它們分配給一個聲明爲接口或超類的類型的引用變量。