Java中非法前向引用的问题

为什么我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;

}


有只小跳蛙
浏览 180回答 1
1回答

蓝山帝景

假设以下类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 //0new MyClass().b //10我无法解释为什么这是合法的,因为这永远不会给出正确的值。我们可以找到一些关于为什么存在限制的解释:上述限制旨在在编译时捕获循环或其他格式错误的初始化。但是为什么允许this工作......知道在实例初始化期间,会发生以下操作:会员声明按顺序执行块和字段初始化构造函数执行给出一些奇怪的行为: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    }}我会限制构造函数中的初始化。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java