[英]Calling base class overridden function from base class method
public class A {
public void f1(String str) {
System.out.println("A.f1(String)");
this.f1(1, str);
}
public void f1(int i, String str) {
System.out.println("A.f1(int, String)");
}
}
public class B extends A {
@Override
public void f1(String str) {
System.out.println("B.f1(String)");
super.f1(str);
}
@Override
public void f1(int i, String str) {
System.out.println("B.f1(int, String)");
super.f1(i, str);
}
}
public class Main {
public static void main(String[] args) {
B b = new B();
b.f1("Hello");
}
}
我正在尋求此代碼將輸出:
B.f1(String)
A.f1(String)
A.f1(int, String)
然而我得到:
B.f1(String)
A.f1(String)
B.f1(int, String)
A.f1(int, String)
我知道在 A.f1(String) 中 B "this" 的上下文中是 B 的實例。 我可以選擇執行鏈 new B1().f1(String) -> (A's) f1(String) -> (A's) f1(int, String) 嗎?
這是一個理論問題,實際上解決方案顯然是在 A 中實現 f1(String) 和 f1(int, String) 都會調用的私有函數。
謝謝,
格言。
抱歉不行
我相信你知道,但為了完整性我會明確說明 - 只有 2 個關鍵字來控制方法調用:
this.method()
- 從調用實例的類(實例的“頂部”虛擬表 - 隱含默認值)開始尋找方法super.method()
- 從定義調用方法的類的父類開始查找方法(調用類的父虛擬表 -不是嚴格的 true ,但更容易想到這種方式 - 感謝@maaartinus )我可以想象另一個關鍵字(例如 current?)做你所描述的:
current.method()
- 從定義調用方法的類開始查找方法但是 Java 沒有這樣的關鍵字(還沒有?)。
恐怕這是不可能的,但有一個簡單的解決方法:
public class A {
public void f1(String str) {
System.out.println("A.f1(String)");
privateF1(1, str);
}
private void privateF1(int i, String str) {
System.out.println("A.f1(int, String)");
}
public void f1(int i, String str) {
privateF1(i, str);
}
}
Java 中的重寫方法是動態綁定的。 即對象的實際實例的類型決定了將調用什么。 final
方法(不能被覆蓋)和private
方法(不能被繼承)是靜態綁定的。
相比之下,在 C++ 中,您必須顯式地使函數成為virtual
函數才能獲得相同的行為。
package main;
public class A {
public void f1(String str) {
System.out.println("A.f1(String)");
if (this instanceof B)
new A().f1(1, str);
else
this.f1(1, str);
}
public void f1(int i, String str) {
System.out.println("A.f1(int, String)");
}
}
class B extends A {
@Override
public void f1(String str) {
System.out.println("B.f1(String)");
super.f1(str);
}
@Override
public void f1(int i, String str) {
System.out.println("B.f1(int, String)");
super.f1(i, str);
}
public static void main(String[] args) {
A a = new B();
a.f1("Hello");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.