[英]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.