2013-09-26 83 views
0

假設我有兩個類A和B,其中A是B的超現在,我寫一個函數(覆蓋),說在兩個類本功能()。那麼,如果我想從B的對象中調用A中的funct(),有可能嗎?調用子類從超類中重寫功能JAVA

+0

@ Dukeling我的意思是你不能從對象本身之外調用超類方法。 –

+1

爲什麼你想這樣做呢? – Achrome

+0

@AshwinMukhija我只是想了解實施情況,無論是否可行。 –

回答

0

鑑於類你問

然後,如果我想從B的對象調用A中的本功能(),它是可能 ?

因此,讓我們

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(); 
    } 
} 
+0

所以,我們不能直接通過使用一個對象來調用over-ridden函數,對吧?謝謝您的幫助! –

+0

@DChetan沒錯。別客氣。 –

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

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

這就是你想要的嗎?

相反,如果你想直接調用A#f()對B型的實例,你必須提供一個佔位符的功能:像

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

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

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(); 
1

我有特技如這種情況下,以一個不合邏輯的方式在本功能使用標誌的參數(操作它)的方法:d,如下所示:

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