[英]Assigning a value to final instance variable using this keyword
我想了解final变量的使用中缺少什么。 我尝试了很多关于这种奇怪(至少对我而言)的行为的搜索,很想知道幕后发生的事情。
Java规范说:可以将变量声明为final。 最终变量只能分配给一次 。 声明一个变量> final可以作为有用的文档,它的值不会改变,并且可以帮助避免编程>错误。
如果将最终变量赋值给了它,则是编译时错误,除非在赋值之前绝对未赋值(§16)>。
空白的final是其声明缺少初始化程序的final变量。
现在考虑以下代码:
public class Sample {
private final int a;
private final Object object1; // compile error that object1 is not initialized
private final Object object2 = null;
public Sample(int value) {
System.out.println(this.a);
a = value;
System.out.println(this.a);
object2 = new Object(); // Compile error that it shouldn't change
}
}
以下是我的观察:
public final int a
,JVM会将默认值0分配给 (a=value)
private final Object object1
它会给出一个编译时错误,即object1没有初始化。 尽管默认情况下,JVM默认情况下为实例成员分配“空”值。 private final Object object2=null
它就会按预期工作。 现在有人可以回答,当使用final关键字时, 为什么编译器在对基元和对象的默认分配下 表现不同 ?
如果您觉得这是一个愚蠢的问题感到抱歉,但是请您指出可从中获得答案的消息来源。
谢谢
沙拉斯
在第2行public final int中,JVM会将默认值0分配给
JVM就是这样做的。 那不是编译器所做的-这不是源代码中的赋值。 它只是变量在分配任何其他值之前所具有的值。
JLS并不是说您无法观察到构造函数中最终变量的值更改。 它说您必须只一次分配一个最终变量。 这正是为案例a
-唯一分配给它的构造函数中,所以它的罚款。
这里的基元和类之间没有区别-如果在字段声明中为a
显式赋值为0
,则在构造函数中尝试赋给a
时会看到相同的错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.