2015-09-13 236 views
2

這似乎是一個基本問題。但面試前值得澄清。抽象類非抽象方法調用

我在抽象類中有一個非抽象方法。它的具體類重寫了這個方法。但我想調用父類的原始方法來調用而不是重寫方法。有什麼辦法可以做到嗎?

據我所知,有沒有辦法調用原始方法?

public abstract class Testabstract { 

    public void t1() { 
     System.out.println("parent"); 
    } 

} 


public class Testconcrete extends Testabstract { 

    public void t2() { 
     System.out.println("child11"); 
    } 

    public void t1() { 
     System.out.println("childss"); 
    } 

} 

public class Main { 

    public static void main(String[] args) { 

     Testconcrete a = new Testconcrete(); 

     a.super.t1();// compile error 
     a.t2(); 

    } 
} 

回答

2

不,您不能直接調用超類的重寫方法。這是設計的;該子類可能會添加某些正確性所必需的行爲(例如維護某種緩存或其他數據結構)或功能需求(如日誌記錄)。繞過子類的功能會使模型的正確性處於危險之中,並破壞確保它的封裝。

1

super關鍵字只能在子類中使用。

對於離你可以嘗試做

public void t2() { 
     super.t1(); 
     System.out.println("child11"); 
    } 

鑄造到Parent也不會仍然工作的根本要素是Child

因此,您無法以乾淨的方式從Child類外部訪問。不知道他們是否有任何天真的做法。

+0

謝謝。 任何其他方式不改變現有的類? –

0

你的理解是正確的。無需更改TestabstractTestconcrete類中的任何一個,就無法在Testconcrete的實例上調用原始方法。

我不認爲甚至有可能用反射來做到這一點。