[英]public final or protected final method does not override in base class and when we make a method “PRIVATE FINAL” in parent class its override
在基类中不覆盖public final
或protected final
方法很简单,当我们在父类中将方法private final
,即使您将父类private final
并在其子类中使用protected final
扩展,它也会被覆盖。 有人可以解释这种行为吗?
class A {
private final void show() {
System.out.println("Show method from A");
}
}
class B extends A {
protected final void show() {
System.out.println("Show method from B");
}
public static void main(String... s) {
new B.show();
}
}
嗨,就像其他人说的那样,您误解了覆盖。 首先,类A中的show方法是私有的。 因此不能从该类的外部访问私有成员。下面的示例将说明这一点:
class A {
private final void show() {
System.out.println("Show method from A");
}
}
public class B extends A {
// protected final void show() {
// System.out.println("Show method from B");
// }
public static void main(String... s) {
new B().show();
}
}
如果您对此进行编译,则会出现以下错误:
B.java:12: error: cannot find symbol
new B().show();
^
symbol: method show()
location: class B
1 error
在您的问题中,它正在调用在类B中定义的方法“ show()”,而不是Ai希望这样可以澄清您的疑问。
您可以将某些或所有类的方法声明为final。 您可以在方法声明中使用final关键字,以指示该方法不能被子类覆盖。 Object类执行此操作-它的许多方法都是最终的。
如果方法的实现不应该更改并且对于对象的一致状态至关重要,则可能希望将其定型。
来自Java官方文档的声明。
如果您的代码是
A a = new B();
a.show();
然后,您将尝试从父类调用无法覆盖的方法。 由于在您的示例中这是私有的,因此您将无法使用它。 尝试使用公共方法。
所以发生的事情是,当对象的类型为B时,您的B.show()方法将掩盖A.show()-这始终是事情的工作方式。 当您的引用是父类的类型时,覆盖方法有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.