我有以下课程:
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方法?
答案 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()。所有静态方法和变量的范围都是类级别而不是对象级别。