Java编译器整数错误

And*_*eas 2 java

我有这个出现在测验中的代码

public class Main {
  public static void main(String[] args) {
    class b {
      int i = 32;
      b() { b(); }
      void b() { System.out.println(++i); }
    }

    class d extends b {
      int i = 8;
      d() {}
      void b() { System.out.println(--i); }
    }

    b b = new d();
  }
}
Run Code Online (Sandbox Code Playgroud)

输出应该是什么?原来答案是-1,而我预计它是7。java 坏了吗?

Ani*_*wat 14

让我们来看看执行顺序:

  1. new d()创建 的对象之前d,它需要调用super()
  2. 控制权转移到 的默认构造函数b
  3. class 的构造函数b将调用该方法,b但由于class 中有一个可用的覆盖方法d,它将被调用。
  4. 请注意,b尚未创建的实例,并且 的值i是隐藏的(d.i隐藏b.i),因此 的值i0。这样做--i生成-1作为输出。