簡體   English   中英

從JAVA的子類中調用超類中的重寫函數

[英]calling overridden function in superclass from subclass in JAVA

假設我有兩個類A和B,其中A是B的超類。現在,我編寫一個函數(重寫),在兩個類中都說funct()。 然后,如果要從B的對象調用A中的funct(),可以嗎?

class A {
    public void f() {...}
}

class B extends A {
    @Override public void f() { super.f(); }
}

那是你要的嗎?

相反,如果您想直接在類型B的實例上調用A#f() ,則必須為此提供一個占位符函數:

class B extends A {
    @Override public void f() { ... }
    public void superF() { super.f(); }
}

new B().f(); // calls B#f();
new B().superF(); // calls A#f();

我有這樣的技巧,在funct()方法:D中使用Flag參數以不合邏輯的方式操作它,如下所示:

class A {

    public void funct(boolean callSuper) {
        // avoid using callSuper arg here 
    }
}

class B extends A {

    @Override
    public void funct(boolean callSuper) {
        if (callSuper) {
            super.funct(callSuper);
            return;//if return type is void
        } else {
            //do here the functionality if the flag is false 
        }
    }
}

要么

class A {

    public void funct() {

    }
}

class B extends A {

    private boolean callSuper = false;

    @Override
    public void funct() {
        if (callSuper) {
            super.funct(); // call A.funct() functionality 
            setCallSuper(false);
        } else {
            //do here the functionality of B.funct() if the flag is false 
        }
    }

    public void setCallSuper(boolean callSuper){
        this.callSuper = callSuper;
    }
}

給定類

class A {
    public void funct() {...}
}

class B extends A {
    @Override 
    public void funct() {...}
}

你問

然后,如果要從B的對象調用A中的funct(),可以嗎?

所以我們來

B b = new B();
b.funct(); 
A a = b;
a.funct();
((A)b).funct();

由於多態性和后期綁定,上述所有操作都相同。

調用超類的實現的唯一方法是通過super關鍵字獲取對該成員的引用。

class A {
    public void funct() {...}
}

class B extends A {
    @Override 
    public void funct() {
        super.funct();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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