在Java中,如何引用在方法之后声明的变量?
在使用Java一段时间后,我总是按照以下顺序设计我的类:声明变量、构造函数,然后是方法。我从未想过这一点,直到我遇到了编译得很好的代码:在Java中,如何引用在方法之后声明的变量?,java,compiler-construction,Java,Compiler Construction,在使用Java一段时间后,我总是按照以下顺序设计我的类:声明变量、构造函数,然后是方法。我从未想过这一点,直到我遇到了编译得很好的代码: public class Main { int m1(){ return ++i; } int i=10; } 我的问题是它是如何工作的?这意味着当编译器开始编译这段代码时,它应该从上到下开始,对吗?那么它如何知道变量i代表什么以及它的值是什么呢?“它不能展望未来”,用愚蠢的方式说 有人能告诉我这是怎么回事吗?我唯一的猜测是编译器首先编译变量,
public class Main {
int m1(){
return ++i;
}
int i=10;
}
我的问题是它是如何工作的?这意味着当编译器开始编译这段代码时,它应该从上到下开始,对吗?那么它如何知道变量i代表什么以及它的值是什么呢?“它不能展望未来”,用愚蠢的方式说
有人能告诉我这是怎么回事吗?我唯一的猜测是编译器首先编译变量,然后编译构造函数/方法(不管源代码的顺序如何)。但是我没有遇到任何关于这个的参考/文档,所以我不想盲目假设。这是有效的,因为编译是在一个文档中完成的 第一步是。当编译器解析示例代码时,它“注意到”使用了标识符
i
,并且声明了一个名为i
的变量。基于此信息(和一组规则),编译器匹配标识符声明和标识符用法(例如,构造一个)
检查标识符是否具有正确的使用类型称为类型检查,并且是在一个时间段内完成的
因此,当编译器“询问”诸如“标识符i
代表什么?”之类的问题时,它已经从解析步骤中得到了答案
在运行时之前,可能无法确定变量的值(例如,如果值由用户输入)。但是,如果可以在编译时确定该值,则可以将其用于优化,例如,这是编译过程中稍后的步骤之一。不,它不能展望未来。但它可以记住这样一个事实,即它看到了一个名为
i
的东西,假设稍后会定义它,然后如果该假设被证明是错误的,则稍后抛出一个错误。您似乎还在假设所有编译器都是一次性编译器。我相信最近有人问过这个问题,并指出了一个重复的问题。不过,我似乎找不到它。