繁体   English   中英

使用此关键字为最终实例变量分配值

[英]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
    }
}

以下是我的观察:

  • 在第2行public final int a ,JVM会将默认值0分配给
  • 这就是为什么构造函数中的第一个打印语句打印值“ 0”的原因
  • 然后,我们尝试将默认值修改为传递给构造函数的“值” (a=value)
  • 它允许更改值,然后从下一个分配中,编译器将给出错误。
  • 对于Objects 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM