2010-09-27 93 views
2

是否可以擴展Math類並仍然使用Math類來調用擴展方法?簡單的java繼承問題

例如,我有一個方法public static double mean (LinkedList<? extends Number)我想打電話給這樣的Math.mean(list)。這是可行的嗎?怎麼樣?

謝謝。

回答

10

Doc java.lang.Math中是final類,不能擴展
更新: 靜態方法不能被繼承& final類不能擴展。

+3

這並不十分培訓相關。如果Math **不是最終的,那麼OP仍然不能做他想做的事*因爲方法是靜態的*。 – 2010-09-27 16:05:47

+1

@Kirk Woll是的你是對的,但最主要的是「是否可以擴展數學課並仍然使用Math類來調用擴展方法?」 – 2010-09-27 16:08:31

+0

這與方法是靜態的事實一樣重要。如果數學方法**不是靜態的,那麼OP仍然無法做到他想要的*因爲這個類是最終的。* – AHungerArtist 2010-09-27 16:58:25

3

您不能繼承Math類,因爲它是final。你可以使用組合,也就是編寫自己的包裝類,但是沒有多少意義,因爲Math的所有方法都是靜態的。

4

即使Math不是最終的,你也無法做到這一點。您不能使用超類來調用在子類中定義的函數。根據定義,子類可以訪問超類中定義的所有非私有方法,但超類不能訪問子類中的函數。

+0

感謝您的解釋。這也有幫助。 – nunos 2010-09-27 17:06:31

1

解決方法可能是創建您自己的Math類並將java.lang.Math用作組合。沒有任何改變的方法可以被委託給java.lang.Math中的原始方法。您可以重寫您想要更改的方法或在Math類中公開新方法。

代碼看起來象:


public class YourMath { 
    public static double mean(LinkedList) { 
    //Your new method 
    } 
    public static double abs(double a) { 
    return Math.abs(a); //Delegate 
    } 
    //...... Any other methods 
}