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

时间:2017-07-11 10:47:11

标签: 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);
    }    
}

输出

abc
World
abc

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

只是不确定,因为它使用外部非最终类的句柄,使其有效。

2 个答案:

答案 0 :(得分:6)

If a class is final, it just means it can't be extended

如果您想阻止重新分配,请将变量设为最终。

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);

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

in.name = "World";

将不再编译。

This Wikipedia article描述了final的各种用法。总结起来,它们是:

  • final课程
    • 无法延期
  • final方法
    • 无法覆盖
  • final变量/字段
    • 无法重新分配

还存在static final方法的问题。

答案 1 :(得分:1)

是最终的:

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

该字段。当然,这与“普通”类相同 - 它可以防止对内部类进行子类化。这就是全部!

防止重新确定该值;你也做正常课程的工作:

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

字段最终!

有关最终的详细信息,请参阅here,具体取决于上下文