我有下面的代码,我有一个最终的内部类.
因此,最终它不应该允许重新赋值.但它仍然如此.请解释:
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(); 重新分配不是吗.
只是不确定,因为它使用外部非最终类的句柄,使它工作.
如果要阻止重新分配,请将变量设为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方法问题.
| 归档时间: |
|
| 查看次数: |
100 次 |
| 最近记录: |