为什么baseclass调用子类的方法?

时间:2014-05-28 09:07:18

标签: java subclass base-class

我遇到了以下代码:
BaseClass的:

public class BaseClass {
    String name = "Base";

    public BaseClass() {
        printName();
    }

    public void printName() {
        System.out.println(name + "——Base");
    }
}

DrivedClass:

public class SubClass extends BaseClass {
    String name = "Sub";

    public SubClass() {
        printName();
    }

    public void printName() {
        System.out.println(name + "——Sub");
    }

    public static void main(String[] args) {
        new SubClass();
    }
}

运行代码时,输​​出为:

空 - 子
Sub - Sub

虽然它应该是:

基 - 基地
Sub - Sub

我想知道为什么BaseClass构造函数调用SubClass方法,有人能解释一下吗?提前谢谢。

1 个答案:

答案 0 :(得分:4)

第一行(" null - Sub" )的打印是printName() SubClass从{{1}调用的结果构造函数。从BaseClass构造函数调用printName()时,由于BaseClass中存在重写方法,因此调用SubClass

此时,由于尚未调用printName()构造函数,SubClass的{​​{1}}字段未定义,因此会打印name

第二行(" Sub-Sub" )的打印是SubClass null从{{1}调用的结果构造函数。这一次,实例字段被加载,因此,printName()打印正确的值(即)" Sub"。

这里需要注意的是,两个时间SubClassSubClass方法被调用。只是第一次(因为它是从name类构造函数调用),它的实例字段没有定义,第二次,它们是。