【问题标题】:How does the inheritance of static variables and their values work? [duplicate]静态变量及其值的继承如何工作? [复制]
【发布时间】:2018-12-23 03:04:11
【问题描述】:

我有这段代码,我的问题是,静态变量 z 的值是否在子类之间“共享”?具体:当我声明b时,这是否意味着首先使用A的构造函数并将z的修改值传递给B的构造函数?

public class Test {
  public static void main(String[] args){
    A a = new A();
    System.out.println("A: " + a.x);
    a.print();

    A b = new B();
    System.out.println("B: " + b.x);
    a.print();
  }
}

public class A {
  public static int z; // default: 0
  public int x = 10;

  public A() {
    x++;
    z++; // z = 1
  }

  print(){
    System.out.println("A: "+ x);
    System.out.println("A: "+ ++z); // z = 2
  }
}

public class B extends A {
  public int x = 100;

  public B() {
    x++;
    z++;   //z is not 3. z = 4 (because of the constructor of A that 
                                uses the modified values of z?)
  }

  public void print() {
    System.out.println("B: "+ x);
    System.out.println("B: "+ ++z); // z = 5
  }
}

输出是:

A:11 A:11 A:2 B:11 B:102 B:5

这些值是否传递给子类,因为 z 是静态的,这意味着如果我更改它的值,如果我不通过在 A 中传递另一个具体值来更改 z,它们将在运行我的代码时被更改?

我很困惑。希望有人能给我解释一下。

【问题讨论】:

  • 不涉及继承:是同一个字段
  • 如果您使用您的调试器逐行逐行执行代码,或者您只是将 println() 日志添加到代码中,您就会知道会发生什么。
  • 输出应该是 A: 11 A: 11 A: 2 B: 11 B: 101 B: 5。你需要了解两个主题:1.初始化和实例化的顺序。 2.字段隐藏。

标签: java inheritance static-variables


【解决方案1】:

如果静态变量 z 的值在子类之间“共享”?

是的。 static 变量是类级别的变量,这意味着它们不属于类的实例,而是属于类本身。只要它们没有被声明为私有并且它们不是继承的,它们就可以从子类访问。对于类的所有实例,只有一个 static 变量,无论它是类本身的实例还是它的任何子类的实例。因此:

A.z = 5; // z is 5 now
B.z = 7; // z is 7 now 
System.out.prinln(A.z); // will print 7 since there's only one z shared by everybody
                        // remember, z belongs to A not to an instance of A.

当我声明 b 时,这是否意味着首先使用 A 的构造函数并将 z 的修改后的值传递给 B 的构造函数?

不完全是。在构造子类之前,需要构造其父类。你怎么能扩展一些不存在的东西=]?因此,在子构造函数中的任何其他指令之前调用父构造函数。

public B() {
    x++;
    z++
}

等价于

public B() {
    super(); // initialize A before initializing B
    x++;
    z++
}

如果你没有显式调用super(),除非你需要传递一些你不需要的东西给父构造函数,编译器会为你插入super()。因此,在B 构造函数中,调用了A 的构造函数,但它不会将z 传递给B,它只是按照您的指示去做并继续前进。

【讨论】:

  • 感谢 StaticBeagle 这个非常有用的评论!我想我现在更好地理解了这个概念......
  • @MelTorment 你打赌,很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 2017-01-10
  • 1970-01-01
  • 2017-02-07
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-10
相关资源
最近更新 更多