[英]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.