2010-03-12 59 views
5

我有一個擴展其超類的子類的對象。子類中有一個可以使用該對象調用的重寫方法。 有可能使用子類對象調用超類的函數嗎?使用子類對象訪問超類功能

package supercall; 

public class Main { 

    public static void main(String[] args) { 
     SomeClass obj = new SubClass(); 
     obj.go(); //is there anything like, obj.super.go()? 
    } 

} 

class SomeClass { 
    SomeClass() { 

    } 
    public void go() { 
     System.out.println("Someclass go"); 
    } 
} 

class SubClass extends SomeClass { 
    SubClass() { 

    } 
    @Override 
    public void go() { 
     System.out.println("Subclass go"); 
    } 
} 

考慮上面的代碼。

這打印

子類去

。相反,我必須打印

超類去

回答

15

不,這是不可能的,如果您認爲您需要它,請重新考慮您的設計。覆蓋方法的重點是替換其功能。如果一個不同的班級非常瞭解該班級的內部工作情況,那麼你完全可以封裝封裝。

2

相反的:

System.out.println("Subclass go"); 

super.go(); 

(或者,你知道的,只是沒有實現這些方法...)。

+0

是的。但有時候我也會使用子類的方法。難道不能以其他方式調用超類的方法嗎?像obj.super.go()?當然,這是一個錯誤的構造。我的意思是類似的? – bdhar 2010-03-12 11:17:29

+0

呵呵......我剛剛寫了那個答案(沒有發佈)......狗屎!!! – RubyDubee 2010-03-12 11:19:30

+1

@bdhar:是的,你可以叫'超級'。但是你需要從班上的*進行呼叫。它不能在外部完成。 – 2010-03-12 11:22:52

0

有什麼辦法可以做到這一點?不,沒有。

在運行時,JVM將根據實例類型(這是您的多態性)選擇要調用的方法,而不是基於它聲明的類型。

您的實例是一個子類實例,因此將調用子類中的go()方法。

0

一種方法是讓子類調用超類實現。但我假設那不是你想要的?

class SubClass extends SomeClass {  
SubClass() {}  
    @Override  
    public void go() {  
     super.go 
    } 
} 
+0

@Steve ..使用super調用超類功能關鍵字確實是正確的方法。我想知道的是,如果有任何其他方式來調用超類go()方法使用「obj」作爲參考? – 2010-03-19 06:34:08

3

這裏它打印 子類go 。相反,我必須打印 超類go

好了,那麼不要重寫go method @ subclass,它會調用超類的實現。如果你想運行超級實現,並有其他一些附加的代碼@子類,你可以調用super.go();然後運行一些其他語句。

沒關係,因爲您正在重複使用已編寫的代碼,所以您不應該複製粘貼超類中的代碼並將其放入代碼中,因爲它代碼重複。但如果你的目標是完全改變行爲,那麼不要叫超級