是否有可能在Java中調用可重寫的方法,使得它始終執行「本地定義的」版本而不是從子類重寫版本?即有沒有類似super
這個類,而不是超類?Java:在「this」類中調用函數而不是子類(類似於「super」)
讓我給一個代碼示例,希望能夠說清楚我想要做的事:
class A {
void foo() {
System.out.println("Foo from A");
}
void bar() {
foo(); // <-- This is the important line!
}
}
class B extends A {
@Override
void foo() {
System.out.println("Foo from B");
}
}
如果我做new B().bar()
,它會調用A
定義的bar()
方法,它調用foo()
作爲覆蓋在B
中打印「Foo from B」。
有沒有一種方法可以強制bar()
方法調用A
中定義的foo()
方法,而不是B
?就像我可以在B
中使用super.foo()
來調用A
中定義的foo()
方法?不幸的是,使用this.foo()
仍然會調用子類的版本。即使像((A) this).foo()
或A.this.foo()
不起作用。
顯然,我可以在A
中簡單定義一個私人或最終版本foo()
,然後調用它。但我希望有一個解決方案,我所做的就是將上面的代碼示例中的「重要線條」更改爲調用foo()以使其打印「Foo from A」的不同方式,最好不需要像反射一樣的技巧。
調用哪個'foo()'是由**值**(實例)的類型決定的,而不是由**變量**,i的類型決定的。即'A a = new B(); a.foo();'調用'B.foo()'。 – nalply
看起來您發現了許多(許多)繼承問題。你最好使用組合而不是繼承,這會產生一個更容易閱讀,理解和弄清楚它在做什麼的代碼。 – Guillaume
@Guillaume我很驚訝,這並不足以解決問題。我正在考慮所有的基類型類,例如OutputStream,它們通過將writeback(byte [] b)轉發給write(int b)來提供回退方法實現。如果兩者都覆蓋,則不能再使用超級來利用回退。 –