为了账号安全,请及时绑定邮箱和手机立即绑定

Java中非法前向引用的问题

Java中非法前向引用的问题

有只小跳蛙 2022-11-02 16:46:50
为什么我this在变量声明中使用引用时,不会出现非法前向引用?this声明有和没有它有什么区别?以下示例由于非法前向引用而无法编译:class FailsToCompile {    int a = b; //illegal forward reference    int b = 10;}通过限定编译错误的使用b就this消失了。class Compiles {    int a = this.b; //that's ok    int b = 10;}
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

假设以下类


public class MyClass {

    int a = b;

    int b = 10;

}

JLS 8.3.3。在你的情况下:


使用实例变量,其声明在使用后以文本形式出现有时会受到限制

- 使用是 C 的实例变量初始化程序或 C 的实例初始化程序中的简单名称


现在,使用该成员this允许您访问已使用默认值 ( a = 0, b = 0) 声明但尚未完全初始化的实例。如果您检查以下结果,这是可见的:


public class MyClass {

    int a = this.b;

    int b = 10;

}

你不会得到预期的价值:


new MyClass().a //0

new MyClass().b //10

我无法解释为什么这是合法的,因为这永远不会给出正确的值。我们可以找到一些关于为什么存在限制的解释:


上述限制旨在在编译时捕获循环或其他格式错误的初始化。


但是为什么允许this工作......

知道在实例初始化期间,会发生以下操作:

  1. 会员声明

  2. 按顺序执行块和字段初始化

  3. 构造函数执行

给出一些奇怪的行为:

public class MyClass {


    {

        b = 10;

    }

    int a = this.b;

    int b = 5;

    {

        b = 15;

    }


    public static void main(String[] args) {

        MyClass m = new MyClass();

        System.out.println(m.a); //10

        System.out.println(m.b); //15

    }

}

我会限制构造函数中的初始化。


查看完整回答
反对 回复 2022-11-02
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信