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

问题描述 投票:0回答:1

我最近一直在学习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. 3:11 22 22

  1. 22 22 22
  2. 虽然我能理解输出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中会发生什么?

提前感谢!

[我最近一直在学习Java课程,我们正在处理程序输出,编译错误等。我自己尝试了不同的代码,而实验中的一件事确实让我感到困惑:...

java variables static output shadowing
1个回答
0
投票
重要提示:情况4的答案是11 22 22

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

© www.soinside.com 2019 - 2024. All rights reserved.