构造函数调用中的意外输出

时间:2011-10-12 02:12:27

标签: java constructor

class SuperclassA {
    protected int superValue;                              // (1)
    SuperclassA() {                                        // (2)
        System.out.println("Constructor in SuperclassA");
        this.doValue();                                    // (3)
    }
    void doValue() {                                       // (4)
        this.superValue = 911;
        System.out.println("superValue: " + this.superValue);
    }
}

class SubclassB extends SuperclassA {
    private int value = 800;                               // (5)
    SubclassB() {                                          // (6)
        System.out.println("Constructor in SubclassB");
        this.doValue();
        System.out.println("superValue: " + this.superValue);
    }
    void doValue() {                                       // (7)
        System.out.println("value: " + this.value);
    }
}

public class Javaapp {
    public static void main(String[] args) {
        System.out.println("Creating an object of SubclassB.");
        new SubclassB();                                   // (8)
    }
}

为什么我的输出:

Creating an object of SubclassB.
Constructor in SuperclassA
value: 0
Constructor in SubclassB
value: 800
superValue: 0

我想这应该是这样的:

Creating an object of SubclassB.        
Constructor in SuperclassA
value: 800
Constructor in SubclassB
value: 800
superValue: 0

2 个答案:

答案 0 :(得分:0)

SuperclassA的{​​{1}}正在调用this.doValue()中的doValue()方法,SubClassBvalue创建之前不会被初始化。有关详细信息,请参阅http://en.wikipedia.org/wiki/Method_overriding

答案 1 :(得分:0)

您看到第一个0输出value的原因是value的字段初始值设定项(将其设置为800)直到{的构造函数之前才会运行{1}}即将被召唤。在构造SubclassB期间(必须在构造子类之前发生),SuperclassA在其酉状态中被观察到,即0。