Java 中的变量阴影,多个案例 static/non 静态

Variable shadowing in Java, multiple cases static/non static

我最近一直在学习 Java 的课程,我们正在处理程序输出、编译错误等。 我自己尝试过不同的代码,我的实验中有一件事让我很困惑: 首先,主要方法如下所示:

public static void main(String[] args){
     A a = new A();
     B b = new B();
     A ab = new B();

     System.out.println(a.a + " " + b.a + " " + ab.a);

}

现在我尝试了这些不同的版本:

//1
public class A {
  public static int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
  public static int a = 2;
   public B(){ a = 22;}
}
//------------
//2
public class A {
  public int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
  public static int a = 2;
   public B(){ a = 22;}
}
//--------------
//3
public class A {
  public static int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
   public B(){ a = 22;}
}
//-----------
//4
public class A {
  public int a = 1;
   public A() {
    a = 11;
   }
}
public class B extends A {
   public B(){ a = 22;}
}

输出如下:

  1. 11 22 11

  2. 11 22 11

3: 11 22 22

  1. 22 22 22

虽然我能理解输出 1 和 2,但 3 和 4 真的让我感到困惑。

对于3:B中的a = 22,为A对象ab改变了a的值,因为在B中没有再次声明int a?

而对于4:如果A中的int a不是静态的,而a是A类型的对象,为什么a.a有b.a的价值?当我将 int a 设置为非静态时,4 中发生了什么?

提前致谢!

重要提示:案例 4 的答案是 11 22 22

情况3:当A ab = B()执行B的构造函数时,设置A中的静态变量a,使其值为22。

情况4:classes A和B都有实例字段(a)(实际上class B从class A继承了这个属性)并且在构造时首先Class A 的构造函数执行,然后 class B 的构造函数,所以当我们有 A a = B() class A 的第一个构造函数时,将变量 a 设置为 11 然后 class B 设置为22 子项中的静态字段 class 不要覆盖父项中的静态字段 class 它们只是隐藏父项中的静态字段 class 如果您访问静态结果不取决于对象的类型本身,但它取决于您用来访问该对象的引用类型,因此当您编写 A a = B() 时,如果 A 和 B 都具有静态字段 a,则 a.a 的结果是 [=17 中的 a =] A 不是 class B 中的 a 因为你在这里访问对象的引用类型是 A,而对象类型本身是 B.