最终的内部类可以重新初始化吗?

ViS*_*ViS -1 java

我有下面的代码,我有一个最终的内部类.

因此,最终它不应该允许重新赋值.但它仍然如此.请解释:

public class POJO {

    public final String vNew;

    public POJO () {
        vNew="hello";
    }

    final class abc {
        String name="abc";
    }

    public static void main(String[] args) {
        POJO vPOJO = new POJO();
        POJO.abc in=vPOJO.new abc();  
        System.out.println(in.name);
        in.name="World";
        System.out.println(in.name);
        in=vPOJO.new abc();
        System.out.println(in.name);
    }    
}
Run Code Online (Sandbox Code Playgroud)

输出是

abc
World
abc
Run Code Online (Sandbox Code Playgroud)

代码POJO.abc in = vPOJO.new abc(); in = vPOJO.new abc(); 重新分配不是吗.

只是不确定,因为它使用外部非最终类的句柄,使它工作.

Moi*_*ira 6

如果是一个类final,它只是意味着它不能被扩展.

如果要阻止重新分配,请将变量设为final.

POJO vPOJO = new POJO();
final POJO.abc in = vPOJO.new abc(); //Notice the final
System.out.println(in.name);
in.name = "World";
System.out.println(in.name);
in = vPOJO.new abc(); // Compilation error
System.out.println(in.name);
Run Code Online (Sandbox Code Playgroud)

当然,如果您想阻止重新分配name 字段,请final改为使用该字段.如果你那样做,

in.name = "World";
Run Code Online (Sandbox Code Playgroud)

将不再编译.

这篇维基百科文章描述了各种用途final.总结一下,它们是:

  • final
    • 不能延长
  • final 方法
    • 不能被覆盖
  • final 变量/场
    • 不能重新分配

还有static final方法问题.