2017-08-16 82 views
8

请看看这段代码:爪哇 - 扩展为什么超变量是0

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

+0

您确定按照您认为的顺序调用构造函数吗? –

+4

@ cricket_007:当然这是所谓的。你**不能**避免在Java中调用它。 –

+0

@ T.J.Crowder您可以通过使用序列化或克隆来避免它。 – Flown

回答

14

Sup构造函数调用printA()它执行Sub类的printA方法(它覆盖类Sup的相同名称的方法),所以它返回a可变Sub类的,这仍然是0的值,因为Sub的实例变量尚未初始化(它们只在Sup构造函数完成后才初始化)。

+2

这也是为什么一些代码标准要求在构造函数中调用的所有方法都是“final”或“private”的原因。防止覆盖导致这些情况。 – Kiskae