在java中如何引用方法后声明的变量?

wrrgggsh  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(318)

在使用java一段时间之后,我总是按照以下顺序设计我的类:声明变量、构造函数,然后是方法。我从来没有想过这一点,直到我遇到了编译得很好的代码:

public class Main {

int m1(){
    return ++i;
}

int i=10;

}

我的问题是它是如何工作的?意思是当编译器开始编译这段代码时,它应该从上到下开始,对吗?那它怎么知道呢 variable i 代表什么,它的价值是什么?”它不能展望未来”,用愚蠢的方式说。
有人能告诉我这是怎么回事吗?我唯一的猜测是编译器首先编译变量,然后编译构造函数/方法(不管源代码的顺序如何)。但我没有遇到任何关于这个的参考/文档,所以我不想做盲目的假设。

6ljaweal

6ljaweal1#

这是因为编译是分多个步骤完成的。
第一步是解析。当编译器解析示例代码时,它会“注意”标识符的用法 i 有一个变量的声明恰好有 i . 基于这些信息(和一组规则),编译器匹配标识符声明和标识符用法(例如,构造一个符号表)。
检查标识符是否具有正确的用法类型称为类型检查,在后面的步骤中完成。
所以,当编译器“询问”诸如“标识符是什么”之类的问题时 i 它已经有了解析步骤的答案。
在运行时之前(例如,如果值是由用户输入的),可能无法确定变量的值。但是,如果可以在编译时确定该值,则可以将其用于优化,例如常量传播,这是编译过程中的后续步骤之一。

相关问题