Java中的变量阴影,多种情况下为静态/非静态

Java中的变量阴影,多种情况下为静态/非静态,java,variables,static,output,shadowing,Java,Variables,Static,Output,Shadowing,我最近一直在学习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); } 现在我尝试了这些不同的版

我最近一直在学习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;}
}
产出如下:

  • 11 22 11

  • 11 22 11

  • 3:11222

  • 22
  • 虽然我能理解输出1和输出2,但输出3和输出4确实让我感到困惑

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

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


    提前谢谢

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

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

    在案例4中:类A和类B都有实例字段(A)(实际上类B从类A继承了这个属性),在构造时,首先执行类A的构造函数,然后执行类B的构造函数,所以当我们有A=B()时,类A的第一个构造函数将变量A设置为11,然后类B的构造函数将其设置为22
    子类中的静态字段不重写父类中的静态字段如果访问静态字段,它们只会隐藏父类中的静态字段结果不取决于对象本身的类型,而是取决于用于访问该对象的引用的类型因此当您编写A=B()时,如果A和B都有静态字段A,a.a的结果是a类中的a而不是B类中的a,因为您用于访问此处对象的引用类型是a,而对象类型本身是B。

    您在说什么?对于4.)预期输出为“11 22”