覆盖java中的“私有”方法

这个想法有些含糊不清,我需要一些澄清。

我的问题是使用此代码时:

public class B { private void don() { System.out.println("hoho private"); } public static void main(String[] args) { B t = new A(); t.don(); } } class A extends B { public void don() { System.out.println("hoho public"); } } 

输出是hoho private

这是因为主要function是与方法相同的类,还是因为重写?

我已经在一本书中读到了这个想法,当我把main函数放在另一个类中时,我得到了一个编译器错误。

您不能覆盖private方法。 如果将AB则不可见。 你可以覆盖一个protected方法,但这不是你在这里做的(是的,如果你将你的main移动到A那么你会得到另一个方法。当你打算覆盖时,我会推荐@Override注释,

 class A extends B { @Override public void don() { // <-- will not compile if don is private in B. System.out.println("hoho public"); } } 

在这种情况下,为什么没有编译器提供使用t.don() private的错误?

Java教程:预定义的注释类型 (部分)

虽然在重写方法时不需要使用此批注,但它有助于防止出错。 如果使用@Override标记的方法无法正确覆盖其某个超类中的方法,则编译器会生成错误。

您不能覆盖私有方法,但您可以在派生类中引入一个没有问题。 derive类无法访问祖先上的私有方法。

由于tB类型的on对象,因此调用don()方法将调用B中定义的方法。它甚至不知道在A类中还有一个名为don()的方法

不,不能覆盖私有方法,因为它在任何其他类中都不可见。 您已为子类声明了一个与超类方法无关的新方法。 查看它的一种方法是问自己在Derived类中编写super.func()是否合法。

这是因为主要function与“don”方法属于同一类

不,这是因为Adon()Bdon()方法无关,尽管它具有相同的名称和参数列表。 private方法隐藏在他们的类中。 它们不能由外部调用者直接调用,例如在您的情况下使用main方法,因为它们封装在类中。 他们不参与方法覆盖。

任何其他类,甚至儿童都看不到私人成员

您不能覆盖私有方法,但是再次,您也无法调用它。 但是,您可以在子项中创建具有相同名称的相同方法。

 public class A { private int calculate() {return 1;} public void visibleMethod() { System.out.println(calculate()); }; } public class B extends A { private int calculate() {return 2;} public void visibleMethod() { System.out.println(calculate()); }; } 

如果你调用A.visibleMethod(),它会输出1。

如果你调用B.visibleMethod()它会打印2。

如果你没有在B中实现私有的calculate()方法,它将无法编译,因为调用它的公共方法无法在A中看到私有方法。