在使用java一段时间之后,我总是按照以下顺序设计我的类:声明变量、构造函数,然后是方法。我从来没有想过这一点,直到我遇到了编译得很好的代码:
public class Main {
int m1(){
return ++i;
}
int i=10;
}
我的问题是它是如何工作的?意思是当编译器开始编译这段代码时,它应该从上到下开始,对吗?那它怎么知道呢 variable i
代表什么,它的价值是什么?”它不能展望未来”,用愚蠢的方式说。
有人能告诉我这是怎么回事吗?我唯一的猜测是编译器首先编译变量,然后编译构造函数/方法(不管源代码的顺序如何)。但我没有遇到任何关于这个的参考/文档,所以我不想做盲目的假设。
1条答案
按热度按时间6ljaweal1#
这是因为编译是分多个步骤完成的。
第一步是解析。当编译器解析示例代码时,它会“注意”标识符的用法
i
有一个变量的声明恰好有i
. 基于这些信息(和一组规则),编译器匹配标识符声明和标识符用法(例如,构造一个符号表)。检查标识符是否具有正确的用法类型称为类型检查,在后面的步骤中完成。
所以,当编译器“询问”诸如“标识符是什么”之类的问题时
i
它已经有了解析步骤的答案。在运行时之前(例如,如果值是由用户输入的),可能无法确定变量的值。但是,如果可以在编译时确定该值,则可以将其用于优化,例如常量传播,这是编译过程中的后续步骤之一。