这个想法有些含糊不清,我需要澄清一些。
我的问题是在使用此代码时:
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
。
这是因为main函数与方法don
在同一个类中,还是因为覆盖?
我已经在一本书中读到了这个想法,当我将main
函数放在另一个类中时,我遇到了编译错误。
答案 0 :(得分:11)
您无法覆盖private
方法。如果您将A
投放到B
,则无法看到。您可以覆盖protected
方法,但这不是您在此处所做的事情(是的,如果您将main
移至{{ 1}}然后你会得到另一种方法。当你打算覆盖时我会推荐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()
的错误?
The Java Tutorials: Predefined Annotation Types说(部分)
虽然在覆盖方法时不需要使用此批注,但它有助于防止出错。如果标有
private
的方法无法正确覆盖其某个超类中的方法,则编译器会生成错误。
答案 1 :(得分:4)
您无法覆盖私有方法,但您可以在派生类中引入一个没有问题。 derive类无法访问祖先的私有方法。
由于 t 是 B 类型的on对象,因此调用don()方法将调用B中定义的方法。它甚至不知道那里是一个在 A
类中也命名为don()的方法答案 2 :(得分:4)
不,私有方法无法被覆盖,因为它在任何其他类中都不可见。您已为子类声明了一个与超类方法无关的新方法。查看它的一种方法是问自己在Derived类中编写super.func()是否合法。
答案 3 :(得分:4)
这是因为主要功能与方法相同的类#&#34; don&#34;
不,这是因为A
&#39; don()
与B
的{{1}}方法无关,尽管相同的名称和参数列表。 don()
个方法隐藏在他们的类中。它们不能由外部调用者直接调用,例如在您的情况下使用private
方法,因为它们封装在类中。他们不参与方法覆盖。
答案 4 :(得分:2)
私人成员对任何其他类都不可见,甚至是儿童
您无法覆盖私有方法,但是再次,您也无法调用它。但是,您可以在子项中创建具有相同名称的相同方法。
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中看到私有方法。