我有下面的代码,我有一个最终的内部类。
所以最终它不应该允许重新赋值。但它仍然如此。请解释一下:
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(); 是重新分配不是它。
只是不确定,因为它使用外部非最终类的句柄,使其有效。
答案 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,具体取决于上下文。