繁体   English   中英

Java中的继承不符合我的预期

[英]inheritance in java does not work the way I expected

我有以下课程:

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方法?

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

由于该方法是静态的,因此从B继承时不会覆盖该方法。 多态仅适用于类的实例。 静态方法不会玩多态游戏,因此不能被覆盖。

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

如果您在派生类中重新定义基类的非静态和非私有方法,则称为overriding

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

您已经在示例中完成了隐藏而不是覆盖。

看看这个SE问题

您正在调用X的继承A方法,这将调用其私有B方法。

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

看来您正在覆盖类Z中的方法B(),但此处未覆盖方法B()。 由于B()是静态的,因此类A和类Z具有自己的方法B()。 所有Static方法和变量的范围都是类级别而不是对象级别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM