java中静态块的优先级是什么?

时间:2011-08-15 15:53:20

标签: java

public class Static
{
    static
    {
        int x = 5;
    }

    static int x,y;
    public static void main(String args[])
    {
        x--; myMethod();
        System.out.println(x + y + ++x);
    }

    public static void myMethod()
    {
        y = x++ + ++x;
    }
}

请问有人帮助我,为什么显示输出是3?

3 个答案:

答案 0 :(得分:13)

  static
  {
        int x = 5;
  }

您在此重新声明x,使其成为本地范围的变量(不是类成员)。无论何时运行,此分配都不会产生任何影响。

现在,您询问了静态阻塞,这就是我所回答的问题。如果您对为什么输出值3的原因感到困惑,即使假设没有进行赋值,那么这也成为关于增量运算符(x++++x)的问题。

完整解释

我非常喜欢Paulo的解释,但让我们看看我们是否可以简化代码。首先,让我们忘记让xy成为静态字段(将它们设置为本地,初始化为静态int:0的默认值)和内联myMethod()

int x = 0, y = 0;
x--;
y = x++ + ++x;
System.out.println(x + y + ++x);

首先,我们应该消除复杂的表达。我们可以通过以正确的顺序将每个子表达式提取到临时变量中来实现这一点(表达式从左到右进行评估):

int x = 0, y = 0;
x--;

int yOperand1 = x++;
int yOperand2 = ++x;
y = yOperand1 + yOperand2;

int resultOperand1 = x;
int resultOperand2 = y;
int resultOperand3 = ++x;
int result = resultOperand1 + resultOperand2 + resultOperand3;
System.out.println(result);

现在我们可以在每一步标记xy和任何临时变量的值:

int x = 0, y = 0;           //x: 0   y: 0
x--;                        //x: -1  y: 0

int yOperand1 = x++;        //x: 0   y: 0  yOperand1: -1
int yOperand2 = ++x;        //x: 1   y: 0  yOperand1: -1  yOperand2: 1
y = yOperand1 + yOperand2;  //x: 1   y: 0

int resultOperand1 = x;     //x: 1   y: 0  resultOperand1: 1
int resultOperand2 = y;     //x: 1   resultOperand1: 1  resultOperand2: 0
int resultOperand3 = ++x;   //x: 2   resultOperand1: 1  resultOperand2: 0  resultOperand3: 2
int result = resultOperand1 + resultOperand2 + resultOperand3; //result: 3
System.out.println(result);

答案 1 :(得分:6)

您的静态块有一个名为x的局部变量,它不会更改具有相同名称的静态变量。

通常,static { ... }块将由编译器按照它们在代码中的顺序与静态变量的初始化程序合并,并在类初始化时执行。 (在字节码中,这是一种静态<clinit>方法。)

在你的程序中会发生以下情况:

  • 静态变量xy初始化为默认值(0)。
  • 执行带有局部变量的静态块,这对程序的其余部分没有影响。
  • 主要方法将执行。
    • 设置x = -1
    • 它调用myMethod()
      • myMethod会两次递增x(从-10再到1),并将y设置为0 (第一次递增前的值+第二次递增后的值)。
    • 它添加了x1),y0)和再次增加x后的值(2),以及打印结果(3)。

答案 2 :(得分:1)

Static.x以值0开头,因为{int x = 5;}创建了一个仅在static块中可见的新变量。由于 x从未使用过,因此无效。如果您将其删除,您应该能够追踪并了解为什么您的答案就是这样。 :)

你想要的是要么使静态块的内容成为赋值而不是声明(即static{ x = 5; }),要么在声明x中赋予static int x = 5;值5。 / p>