前向参照

时间:2019-04-04 22:09:08

标签: java

我是java的新手,我对正向引用有一个疑问。正向引用是对尚未初始化的变量的引用。但是当我们在方法中执行此操作时,错误的类型会有所不同吗?实际上,我的问题是,当我们在方法中使用另一个变量初始化变量时,这是否是引用的用法?

 public static void main(String[] args) {

        int total=number + 10;
        int number;

错误是:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
  symbol:   variable number

没有方法:

class Person 
{

    int total=number + 10;
    int number;

错误是:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - illegal forward reference

2 个答案:

答案 0 :(得分:1)

这是关于scope(强调):

  
      
  • 块中的局部变量声明的范围(第14.4节)是出现声明的块的其余部分,该声明从其自己的初始化程序开始,并在其中包含右侧的任何其他声明符局部变量声明语句。
  •   

  
      
  • 在类类型C中声明或继承的成员m的声明的范围(第8.1.6节)是C的整个主体,包括任何嵌套的类型声明。
  •   

在第一种情况下,您要声明一个局部变量number,因此您只能在声明后 处引用它(但即使那样,您也只能读取一次它)已明确分配)。如果尝试在声明变量之前引用该变量,则好像该变量不存在(因此“找不到符号”)。

在第二种情况下,您要声明一个成员变量,因此您可以在类中的任何位置引用它,包括在声明之前

答案 1 :(得分:-1)

前向引用不适用于局部变量。适用的是确定分配Section 16 of the JLS对此进行了说明。

  

对于每次访问局部变量或空白最终字段x,必须在访问之前明确分配x,否则会发生编译时错误。

在您的情况下,number必须先明确分配int total = number + 10 ,然后{{1}}才能访问它,这说明了为什么会出现编译时错误。