2015-04-29 23 views
0

例如,假設我們已經:在Java中,可以在非靜態方法中多次調用局部變量fi​​nal,導致內存泄漏?

public void doThis() { 
     final Foo foo = Foo.getInstance(); 
     ... initialize foo somehow... 
     baz(Bar.getInstance(foo)); // adds Bar instance to something 
     ... bar will be popped from some list, used, and disposed of... 
    } 

內存泄漏可發生這種情況?

我只是不明白什麼是最終的局部變量的真正含義。這是否意味着局部變量不能被重新分配,就是這樣?是否聲明它最終把它放在java堆/內存中的某個地方,這樣它就像一個實例變量,但具有不同的/獨特的?特別是因爲內部/嵌套類可以使用最終局部變量,但不是非最終局部變量?

+1

簡答題「否」。上下文中的關鍵字'final'只意味着你*不能再改變引用,比如說寫'foo = new Foo(someArgs);'然而引用本身可以像GC一樣被任何非最終引用收集。 –

回答

3

否如果沒有final沒有內存泄漏,那麼將不會有一個final

件事final做一個局部變量(在Java中8)是防止你分配給變量不止一次。

在Java 7及更早版本中,還有另外一個影響,它也與內存泄漏無關。

+0

不僅在Java 8中,'final'自推出以來就以這種方式發揮作用。 – fge

+0

@fge在Java 8之前,您不能在匿名類邊界上使用非最終變量。現在它已經放寬了,所以你不能在一個匿名類的邊界上使用多次分配的變量(不是「有效的」final「)。 – immibis

+0

好的,但是我懷疑這是OP真的在問什麼...... – fge

1

這是否意味着局部變量不能被重新分配,這是什麼?

是這意味着它的行爲就像恆定變量,其中進一步重新分配或修改可能沒有這樣做。

是否宣佈它最終把它放在某處的Java堆/內存,使得它像一個實例變量,但使用不同/獨特之處?

最後是標識符。這是在java堆中分配的另一個變量。沒有可用於 最終變量的特殊內存位置。

特別是由於內/嵌套類可以使用最終的局部變量,但不是非最終局部變量?

內部類可以訪問外部類變量,但除非聲明爲Final,否則它不能使用局部變量。 因爲只要方法局部的內部類對象不能保證局部變量處於活動狀態,內部類對象就不能使用它們。