簡體   English   中英

Java:主類中的遞歸調用subclass-method而不是自己的方法

[英]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();
        ...
    }
}

現在的問題是:

  • 我叫SubClass.doIt()
  • 調用MainClass.doIt()
  • MainClass.doIt()進行遞歸調用doIt()
    但是:調用SubClass.doIt()而不是MainClass.doIt()

這是非常奇怪的行為,編程問題! 我試圖用this.doIt()調用遞歸,但這沒有幫助。 有人有想法嗎?

非常感謝您的回答,這個問題已經解決了。

這是假設的行為,通過不設置方法final ,這意味着它可以override n,所以你必須始終考慮到有人可以做到這一點。 對該方法的調用永遠不會保證是該級別的方法。

但是,您可以使用( protectedfinal方法優雅地解決此問題:

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");
        }
    }
}

在這個例子中, ba都是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.

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