为什么只能在方法

时间:2016-06-26 19:41:56

标签: java variables static

当我们转发引用方法时,编译器中发生了什么,它如何分配未声明的另一个变量的值?我们可以使用内部方法吗?但为什么我们不能在静态块中使用变量?例如,

public class Forward {

    static int i = test();

    static int test() {

        System.out.println(j);
        j = 20;
        return j;
    }

    static {
        System.out.println(j);
        j = 20;
    }
    static int j;
}

如果我们直接指定值,如:

int i = j;
int j = 10;

为什么这段代码无法编译?怎么可能只用方法?编译器如何在内部编译前向引用?声明是否首先针对所有变量和初始化一次性发生,或者一个接一个地发生?详细解释一下。

1 个答案:

答案 0 :(得分:1)

JLS Section 8.3.3表示如果将静态变量的正向使用视为编译时错误,则必须满足4个条件:

  

在使用类变量后,类或接口C中的类变量声明以文本形式出现;

换句话说,显然,它必须是一个"前向声明":你在声明它之前使用它:

// Maybe not OK to use j here.

static int j;

// OK to use j here.
  

在C的类变量初始值设定项或C的静态初始值设定项中使用是一个简单的名称;

如果您对其名称进行限定,则可以对变量进行前向引用:

static {
  System.out.println(j);                       // Error on this line...
  System.out.println(Forward.j);               // ...but not this line...
  System.out.println(org.whatever.Forward.j);  // ...or this line...
}
static int j;

此标准仅适用于变量或静态初始值设定项。这回答了在引用方法中的静态变量时没有遇到编译器错误的具体问题。

然而,让我们完成任务......

  

使用不在作业的左侧;

请注意以下代码:

static {
    System.out.println(j);  // Error on this line...
    j = 20;                 // ...but not this line.
}
static int j;

除了分配变量之外,你不能做任何事情,即使你颠倒了行的顺序(你不能指定并打印它)。

  

C是封闭使用的最里面的类或接口。

以下代码没问题:

class Forward {
  static class Inner {
    static {
      System.out.println(j);
    }
  }

  static int j;
}