【问题标题】:Java - extends why the super variable a is 0Java - 扩展了超变量 a 为 0 的原因
【发布时间】:2018-01-24 15:38:01
【问题描述】:

请看这段代码:

class Sup {
    int a = 8;

    public void printA() {
        System.out.println(a);
    }

    Sup() {
        printA();
    }
}

public class Sub extends Sup {
    int a = 9;

    @Override
    public void printA() {
        System.out.println(a);
    }

    Sub() {
        printA();
    }

    public static void main(String[] args) {
        Sub sub = new Sub();
    }
}

结果: 控制台打印:0 9
我知道子类会先调用超类constructor
但是,为什么是0 9,而不是8 9

【问题讨论】:

  • 你确定构造函数是按照你认为的顺序调用的吗?
  • @cricket_007:当然是被调用了。您不能避免在 Java 中调用它。
  • @T.J.Crowder 你可以通过使用序列化或克隆来避免它。
  • @Flown:嗯,在这两种情况下都在某个时间点调用了超级构造函数。 :-D
  • @T.J.Crowder 就现有对象而言,您是对的。

标签: java extend


【解决方案1】:

Sup构造函数调用printA()时,它会执行Sub类的printA方法(重写了Sup类的同名方法),所以它返回@987654326的值@类Sub的变量,仍然是0,因为Sub的实例变量还没有被初始化(它们只是在Sup构造函数完成后才被初始化)。

【讨论】:

  • 这也是为什么一些代码标准要求在构造函数中调用的所有方法都是finalprivate。为了防止覆盖导致这些情况。
猜你喜欢
  • 1970-01-01
  • 2018-11-20
  • 2011-06-30
  • 1970-01-01
  • 2015-07-28
  • 2016-12-26
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多