簡體   English   中英

從基類方法調用基類覆蓋的函數

[英]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 - this.method() - 從調用實例的類(實例的“頂部”虛擬表 - 隱含默認值)開始尋找方法
  • super - super.method() - 從定義調用方法的類的父類開始查找方法(調用類的父虛擬表 -不是嚴格的 true ,但更容易想到這種方式 - 感謝@maaartinus )

我可以想象另一個關鍵字(例如 current?)做你所描述的:

  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM