Java中的变量范围

One*_*ree 1 java scoping

在Java中,在使用它之前,您没有物理声明方法.同样的事情不适用于变量.为什么会这样?它只是出于"遗留"的原因(即,Java的创建者不喜欢这样做),还是只是不可能?

例如.,

public class Test
{
    // It is OK for meth1 to invoke meth2
    public void meth1() { meth2(); }
    public void meth2() { }

     // But why is it NOT ok for field1 to reference field2
     private int field1 = field2;
     private int field2 = 3;
}
Run Code Online (Sandbox Code Playgroud)

如果我希望我的Java编译器支持这种前向引用,那么关于如何执行它的一般想法是什么?我知道循环依赖关系存在问题,我们需要谨慎对待.但除此之外,我真的不明白为什么不可能.

[编辑]好的,这是我最初的想法,如何做到这一点.在分析代码时,编译器将为给定范围内的变量构建依赖关系图.如果它看到一个循环(即,int a = b; int b = a),那么它会抛出一个错误.如果没有循环,则必须有一些最佳方式来重新排列语句(在场景后面),这样一个字段只会引用在它之前声明的字段,因此它应该尝试找出顺序.我还没有找到确切的算法,但我认为这是可能的.除非有人能科学地证明我是错的.

回顾一下这个问题: 假设我正在尝试构建自己的Java方言,它支持这种范围.我的主要问题是,你能否就如何做到这一点给我一些想法

谢谢

rge*_*man 7

根据JLS,第12.4.1节,类变量的初始化从上到下进行,以"文本顺序":

静态初始值设定项和类变量初始值设定项以文本顺序执行,并且可能不引用在声明在使用后以文本方式出现的类中声明的类变量,即使这些类变量在范围内(第8.3.2.3节).此限制旨在在编译时检测大多数循环或其他格式错误的初始化.

因此,如果您使自己的编译器识别正向类变量声明,那么它违反了Java语言规范.