有人可以解释为什么在执行初始化块后跳过method-methodOfTest()?

时间:2017-02-19 08:35:32

标签: java

public class UnaryOp {
    static int i=1;

    static{
        i= i-- + --i;
        System.out.println(i); // Result comes 0
    }

    {
        i=i++ - ++i;
        System.out.println("i valus is" +i); //Result comes -2
    }

    int methodOfTest(){
        return i+i - i*i/i;

    }

    public static void main(String[] args){
        System.out.println("new UnaryOp().methodOfTest()); //How the result comes as i=-2 when executed instead i=1?


    }

}

执行流程是:

  • 静态阻止
  • 初始化块
  • then methodfOfTest()。

当发生内存分配时,执行初始化块,i值为-2。但是根据我的说法,当执行methodfOfTest()时,i值应为1.但它显示的是-2,它是初始化块的i值。

谁能解释我怎么样?

1 个答案:

答案 0 :(得分:1)

  1. 首先,此代码中存在错误

    System.out.println(“new UnaryOp()。methodOfTest()); //当执行i = -2时,结果如何变为i = 1?

  2. 因为你添加了不必要的引用

    1. 是执行流程正确。

      静态块

      初始化块

      methodfOfTest()。

    2. 当methodOfTest()执行时,i的值为-2

      然后运算符优先级为:

      1. *

      2. /

      3. +

      4. -

      5. 所以结果将被evaluta为(-2 * -2)= 4,现在4 / -2 = -2

        现在-2 + -2 = -4 表达式变为

        -4-(-2)=-2
        

        此表达式根据运算符优先级进行评估。