[英]Java: recursion within main-class calls subclass-method instead of its own method
例:
class MainClass {
public doIt() {
...
else doIt();
}
}
class SubClass extends MainClass {
@Override
public doIt() {
super.doIt();
...
}
}
現在的問題是:
這是非常奇怪的行為,編程問題! 我試圖用this.doIt()調用遞歸,但這沒有幫助。 有人有想法嗎?
非常感謝您的回答,這個問題已經解決了。
這是假設的行為,通過不設置方法final
,這意味着它可以override
n,所以你必須始終考慮到有人可以做到這一點。 對該方法的調用永遠不會保證是該級別的方法。
但是,您可以使用( protected
) final
方法優雅地解決此問題:
class MainClass {
protected final void innerDoIt () { //final: so no @Override
...
else innerDoIt();
}
public void doIt() {
innerDoIt();
}
}
接着:
class SubClass extends MainClass {
@Override
public doIt() {
super.doIt();
...
}
}
final
確保,該方法不能被覆蓋。 所以在那一刻,你有一個合約(保證), innerDoIt
方法確實是你認為的innerDoIt
方法。
因此,如果您不希望調用者被覆蓋 ,只需將其對沖成另一種final
方法。 通過使其protected
,該方法也可以由SubClass
調用。
public class Main {
public static void main(String[] args) {
B b = new B();
b.doIt();
System.out.println();
A a = new B();
a.doIt();
}
public static class A{
boolean check=false;
public void doIt(){
System.out.println("A start");
if(check){
}
else{
check = true;
doIt();
}
System.out.println("A end");
}
}
public static class B extends A{
@Override
public void doIt() {
System.out.println("B start");
super.doIt();
System.out.println("B end");
}
}
}
在這個例子中, b
和a
都是B
類的實例,正如你可能期望的那樣,a.doIt()和b.doIt()將輸出相同的結果。
B start
A start
B start
A start
A end
B end
A end
B end
B start
A start
B start
A start
A end
B end
A end
B end
當你調用doIt()
,你隱式調用this.doIt()
, this
是一個B
類的實例。 如果不分離doIt()
的內容,沒有語法可以做你想做的事(參見CommuSoft的回答)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.