[英]Override “private” method in 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
。
这是因为main函数与don
方法在同一个类中,还是由于重写?
我已经在书中读过这个想法,当我将main
函数放到另一个类中时,我会遇到编译器错误。
您不能覆盖private
方法。 如果将A
强制转换为B
则不可见。 您可以覆盖一个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
的方法未能正确覆盖@Override
类之一中的方法,则编译器将生成错误。
这是因为主函数与方法“ don”位于同一类中
不,这是因为尽管名称和参数列表相同,但A
的don()
与B
的don()
方法无关。 private
方法隐藏在其类中。 它们不能由外部调用程序直接调用,例如您的情况下的main
方法,因为它们封装在类中。 他们不参与方法重写。
不可以,因为不能从任何其他类中看到私有方法,所以不能覆盖它。 您为子类声明了一个与超类方法无关的新方法。 一种看待它的方法是问自己,在Derived类中编写super.func()是否合法。
您不能覆盖私有方法,但可以毫无问题地在派生类中引入一个私有方法。 派生类无法访问祖先上的私有方法。
由于t是B类型的on对象,因此调用don()方法将调用在B处定义的方法。它甚至不知道在类A处也有一个名为don()的方法。
私人成员对其他任何班级都不可见,即使是孩子
您不能覆盖私有方法,但是再次,您也不能调用它。 但是,您可以在子级中创建具有相同名称的相同方法。
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中看不到私有方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.