java中的继承不按我预期的方式工作

时间:2015-11-01 12:34:03

标签: java inheritance

我有以下课程:

public class X {
    public void A() {
        B();
    }

    private static void B() {
        System.out.println("111111111");
    }
}

现在我有以下继承的类Z:

public class Z extends X {

    private static void B() {
        System.out.println("22222222");
    }
}

现在,如果我这样做

Z myClass = new Z();
Z.A();

我将得到:111111111因此。 (另外,eclipse告诉我永远不会调用继承类中的B())。

为什么呢?我怎样才能运行继承的B方法?

4 个答案:

答案 0 :(得分:1)

B方法是静态的。当您调用方法A时,它使用类B的实现(因为这是定义方法A的位置)。类B不知道类Z的存在,也无法调用类Z的方法。

因为该方法是静态的,所以在从B继承时不会覆盖它。多态性仅适用于类的实例。静态方法不会播放多态游戏,也无法覆盖。

答案 1 :(得分:1)

将方法的访问修饰符private static更改为protected

如果你重新定义基类非静态&派生类中的非私有方法,称为覆盖

如果在派生类中重新定义基类静态方法,则称为方法隐藏或方法阴影

你在你的例子中隐藏了相当重写。

看看这个SE Question

答案 2 :(得分:0)

你正在调用X的继承A方法,并调用它的私有B方法。

private方法和属性不会被继承。

答案 3 :(得分:0)

看起来你在Z类中重写了方法B(),但是这里没有覆盖方法B()。由于B()是静态的,所以A类和Z类有自己的方法B()。所有静态方法和变量的范围都是类级别而不是对象级别。