2015-11-01 87 views
0

我有下面的类方式:继承在Java不工作,我希望

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

+5

静态方法不是多态调用的。编译时它们是静态绑定的。使用实例方法。并且不要私有:私有方法是私有的,因此不能被覆盖。 https://docs.oracle.com/javase/tutorial/java/IandI/override.html –

回答

1

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

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

+0

这就是我所害怕的。感谢您的解释。 – dsb

+0

@dsb - 当然,祝你好运:) – Avi

+1

它也没有被覆盖,因为该方法是'私人'。一个私有方法甚至在一个子类中都没有看到,所以它不能被覆盖。如果你给它一个不同的访问修饰符,那么它也是“静态”的事实会发挥作用。 –

0

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

private方法和属性不被继承。

+0

非常感谢。我将它从私有变为受保护但仍然是相同的行为。任何想法为什么? – dsb

+2

这不是原因。原因是该方法是静态的。 – Avi

+0

@Avi事实上,它是非常多的原因,就像它是静态的事实是原因。 –

1

更改方法的访问修饰符private staticprotected

如果重新定义基类的非静态的派生类&非私有方法,这就是所谓的覆盖

如果重新定义派生类的基类的静态方法,这就是所谓的方法隐藏或方法阴影

你已经完成了隐藏,而不是在你的例子中重写。

看一看这个SE Question

0

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