Java继承基类使用派生类方法

Rof*_*gar 3 java inheritance

最近我偶然发现了Java测试并发现了一个奇怪的行为.

class MainOne {

    private int i = 5;

    public MainOne() {
        System.out.println("MainOne says that I is " + getI());
    }

    public int getI() {
        System.out.println("MainOne getI was used");
        return i;
    }

}

public class TheTest extends MainOne {

    private static int i = 10;

    public TheTest() {
        System.out.println("TheTest says that I is " + super.getI());
    }


    public int getI() {
        System.out.println("TheTest getI was used");
        return i;
    }

    public static void main(String[] args) {
        TheTest test = new TheTest();
    }

}
Run Code Online (Sandbox Code Playgroud)

结果是:

使用了测试getI

MainOne说我10岁.

使用了MainOne getI

TheTest说我5岁

问题是,发生了什么?为什么Base类使用它后代的方法?

Sot*_*lis 5

这完全是关于执行顺序和构造函数继承.TheTest构造函数隐式调用super MainOne构造函数.

所以

public TheTest() {
    System.out.println("TheTest says that I is " + super.getI());
}
Run Code Online (Sandbox Code Playgroud)

电话

public MainOne() {
    System.out.println("MainOne says that I is " + getI());
}
Run Code Online (Sandbox Code Playgroud)

getI()由于多态性而调用覆盖.

public int getI() {
    System.out.println("TheTest getI was used");
    return i;
}
Run Code Online (Sandbox Code Playgroud)

i这里是static i中声明TheTest.最后

super.getI());
Run Code Online (Sandbox Code Playgroud)

被调用使用MainOnei.

你得到了

TheTest getI was used

MainOne says that I is 10.

MainOne getI was used

TheTest says that I is 5
Run Code Online (Sandbox Code Playgroud)

请注意,多态不适用于字段,并且该字段(无论是static或实例)可能隐藏父类中相同名称的字段.