在Java中,在多次调用的非静态方法中使用局部变量final会导致内存泄漏吗?

在Java中,在多次调用的非静态方法中使用局部变量final会导致内存泄漏吗?,java,memory-leaks,final,Java,Memory Leaks,Final,例如,假设我们有: 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 dispos

例如,假设我们有:

    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...
    }
这种情况下会发生内存泄漏吗


我只是不明白最终局部变量的真正含义。这是否仅仅意味着局部变量不能重新分配,就是这样?声明final是否会将它放在java堆/内存中的某个位置,这样它就像一个实例变量,但具有不同的/唯一的属性?特别是因为内部/嵌套类可以使用最终局部变量,但不能使用非最终局部变量?

否。如果没有
final
的内存泄漏,那么就不会有
final
的内存泄漏

final
对局部变量(在Java 8中)1所做的唯一一件事是防止您多次赋值给该变量


1在Java 7和更早版本中,还有另一个与内存泄漏无关的影响。

否。如果没有
final
的内存泄漏,那么就不会有
final
的内存泄漏

final
对局部变量(在Java 8中)1所做的唯一一件事是防止您多次赋值给该变量


1在Java 7和更早版本中,还有另一个与内存泄漏无关的影响。

这是否仅仅意味着无法重新分配局部变量,就是它

是的,这意味着它的行为类似于常量变量,无法进行进一步的重新分配或修改

声明final是否会将它放在java堆/内存中的某个位置,这样它就像一个实例变量,但具有不同的/唯一的属性

最后一个是标识符。这是java堆中分配的另一个变量。没有可用于的特殊内存位置 最后一个变量

特别是因为内部/嵌套类可以使用最终局部变量,但不能使用非最终局部变量

内部类可以访问外部类变量,但除非声明为Final,否则不能使用局部变量。 因为局部变量不能保证只要方法是局部内部类对象就存在,所以内部类对象不能使用它们


这是否仅仅意味着局部变量不能重新分配,就是这样

是的,这意味着它的行为类似于常量变量,无法进行进一步的重新分配或修改

声明final是否会将它放在java堆/内存中的某个位置,这样它就像一个实例变量,但具有不同的/唯一的属性

最后一个是标识符。这是java堆中分配的另一个变量。没有可用于的特殊内存位置 最后一个变量

特别是因为内部/嵌套类可以使用最终局部变量,但不能使用非最终局部变量

内部类可以访问外部类变量,但除非声明为Final,否则不能使用局部变量。 因为局部变量不能保证只要方法是局部内部类对象就存在,所以内部类对象不能使用它们


不仅在Java8中
final
自从在该语言中引入以来一直是这样工作的。@在Java 8之前的fge中,您不能跨匿名类边界使用非final变量。现在它被放宽了,这样您就不能在匿名类边界上使用多次赋值的变量(而不是“有效地
final
”)
final
自从在该语言中引入以来一直是这样工作的。@在Java 8之前的fge中,您不能跨匿名类边界使用非final变量。现在它被放宽了,这样您就不能在匿名类边界上使用多次赋值的变量(不是“有效地
final
”)。上下文中的关键字
final
仅表示您不能再更改引用,比如write
foo=newfoo(someArgs)但是引用本身可以像任何非最终引用一样由GC收集。简短回答“否”。上下文中的关键字
final
仅表示您不能再更改引用,比如write
foo=newfoo(someArgs)