Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如何引用在方法之后声明的变量?_Java_Compiler Construction - Fatal编程技术网

在Java中,如何引用在方法之后声明的变量?

在Java中,如何引用在方法之后声明的变量?,java,compiler-construction,Java,Compiler Construction,在使用Java一段时间后,我总是按照以下顺序设计我的类:声明变量、构造函数,然后是方法。我从未想过这一点,直到我遇到了编译得很好的代码: public class Main { int m1(){ return ++i; } int i=10; } 我的问题是它是如何工作的?这意味着当编译器开始编译这段代码时,它应该从上到下开始,对吗?那么它如何知道变量i代表什么以及它的值是什么呢?“它不能展望未来”,用愚蠢的方式说 有人能告诉我这是怎么回事吗?我唯一的猜测是编译器首先编译变量,

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

public class Main {

int m1(){
    return ++i;
}

int i=10;

}
我的问题是它是如何工作的?这意味着当编译器开始编译这段代码时,它应该从上到下开始,对吗?那么它如何知道变量i代表什么以及它的值是什么呢?“它不能展望未来”,用愚蠢的方式说


有人能告诉我这是怎么回事吗?我唯一的猜测是编译器首先编译变量,然后编译构造函数/方法(不管源代码的顺序如何)。但是我没有遇到任何关于这个的参考/文档,所以我不想盲目假设。

这是有效的,因为编译是在一个文档中完成的

第一步是。当编译器解析示例代码时,它“注意到”使用了标识符
i
,并且声明了一个名为
i
的变量。基于此信息(和一组规则),编译器匹配标识符声明和标识符用法(例如,构造一个)

检查标识符是否具有正确的使用类型称为类型检查,并且是在一个时间段内完成的

因此,当编译器“询问”诸如“标识符
i
代表什么?”之类的问题时,它已经从解析步骤中得到了答案


在运行时之前,可能无法确定变量的值(例如,如果值由用户输入)。但是,如果可以在编译时确定该值,则可以将其用于优化,例如,这是编译过程中稍后的步骤之一。

不,它不能展望未来。但它可以记住这样一个事实,即它看到了一个名为
i
的东西,假设稍后会定义它,然后如果该假设被证明是错误的,则稍后抛出一个错误。您似乎还在假设所有编译器都是一次性编译器。我相信最近有人问过这个问题,并指出了一个重复的问题。不过,我似乎找不到它。