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

3 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 13

  static
  {
        int x = 5;
  }
Run Code Online (Sandbox Code Playgroud)

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

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

完整的解释

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

int x = 0, y = 0;
x--;
y = x++ + ++x;
System.out.println(x + y + ++x);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

现在,我们可以标记的价值x,y并在每个步骤中,任何临时变量:

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);
Run Code Online (Sandbox Code Playgroud)


Paŭ*_*ann 6

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

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

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

  • 静态变量xy使用其默认值(0)进行初始化.
  • 执行静态块及其局部变量,这对程序的其余部分没有影响.
  • main方法将执行.
    • 它设定x = -1.
    • 它调用myMethod().
      • myMethod将两次递增x(从-101),并设置y0(第一次递增前的值+第二次递增后的值).
    • 它添加x(1),y(0)和x再次增加(2)之后的值,并打印结果(3).

  • @Martijn:它有效果.但是传入加法的值是"-1",而不是0.然后x为0并递增为1,其中1作为第二个操作数传递给加法.因此它被解析为'y = -1 + 1`. (2认同)