初始化块中的“this”关键字是什么意思? [复制]

2023-11-27

这是我的代码:

class StaticBlock {
    {       
        println("initializer block : " + message);
    }
    public StaticBlock(String message) {
        this.message = message;
    }
    private String message;
}

现在的问题是,在初始化块中

{       
    println("initializer block : " + message);
}

如果我添加this之前的关键字message,可以用,但是丢失的时候出现错误this关键词。

编译器说:

StaticBlockDemo.java:34: illegal forward reference
                println("initializer block : " + message);
                                                 ^
1 error

为什么它们不一样?


我不知道设计原理,但阅读Java语言规范的相关部分可能会有所帮助。

8.6。实例初始化器

允许实例初始值设定项通过关键字引用当前对象this(§15.8.3),使用关键字super(§15.11.2,§15.12),并在范围内使用任何类型变量。

其声明在使用后以文本方式出现的实例变量的使用有时会受到限制,即使这些实例变量在作用域内。有关管理对实例变量的前向引用的精确规则,请参阅第 8.3.2.3 节。

8.3.2.3。初始化期间Fields的使用限制

仅当成员是实例时(分别为static) 类或接口的字段C并且满足以下所有条件:

  • 使用发生在实例中(分别static) 变量初始值设定项C或在实例(分别是静态)初始化程序中C.

  • 用法不在赋值的左侧。

  • 用法是通过一个简单的名称。

  • C是包含用法的最内部类或接口。

以下是规范该部分的示例,经过删减,以说明您所询问的具体问题:

class UseBeforeDeclaration {

    {
        j = 200;
          // ok - assignment
        j = j + 1;
          // error - right hand side reads before declaration
        int k = j = j + 1;
          // error - illegal forward reference to j
        int n = j = 300;
          // ok - j at left hand side of assignment
        int h = j++;
          // error - read before declaration
        int l = this.j * 3;
          // ok - not accessed via simple name
    }

    int j;
}

不过,我还应该指出,即使是代码的编译版本也不会执行您想要的操作。如果你运行它:

new StaticBlock("abc");

它将打印

initializer block : null

这是因为初始化程序是在(大部分)构造函数主体之前执行的。以下是规范中的要点:

12.5。创建新的类实例

[...]使用以下过程处理指定的构造函数以初始化新对象:

[...]

4. 执行该类的实例初始值设定项和实例变量初始值设定项[...]

5. 执行该构造函数主体的其余部分。[...]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初始化块中的“this”关键字是什么意思? [复制] 的相关文章

随机推荐