2011-04-01 23 views
0

我有一個關於StringBuilder類中的append方法的問題。我被問及如何重寫StringBuilder類中的append()方法,而stringBuilder類是final。是相同的邏輯適用於重寫String類中的toString(),而String類是final?請幫幫我。在stringBuilder中重寫append方法?

感謝

回答

0

覆蓋String類中的toString覆蓋java.lang.Stringjava.lang.Object的方法。由於該類聲明爲final,所以不能從它派生出來,因此不會覆蓋toString-method,這是String中的特例,因爲它返回String本身。

重寫最終類中的方法是不可能的。而append()不是Object中的一個方法,所以它們不是等價的,但是你也不能重寫append。

+0

我相信你的意思是'延長最後一堂課,而不是壓倒一切。重寫最終的方法是不可能的。 – corsiKa 2011-04-01 23:20:22

+0

你說得對。我會糾正我的表述。 – 2011-04-01 23:26:24

+2

事實上,在'String'中''toString()'方法實現爲'return this;'。 – 2011-04-01 23:39:34

4

不,你真的不能重寫final方法,可能有一些字節級魔法,將允許你這樣做,但我不知道這是值得的。

您可以創建一個包裝類,像MyStringBuilder併爲StringBuilder的方法,每一個創建代表們的StringBuilder一個實例,那麼你就可以在您認爲合適修改append方法的方法。這種方法有一個問題,那就是你不能訪問StringBuilder中定義的變量private,雖然這對你的用例可能不是什麼大不了的。 YMMV

+0

+1不值得。如果你要編寫自己的'javac'實現,你可以做任何你想做的事情,包括忽略final關鍵字或誰知道還有什麼。但這並不是一個好主意! – corsiKa 2011-04-01 23:21:45

-1

這些類是最終的設計。 API設計者不想處理將這些類作爲繼承基類的複雜性。

除了繼承,您可以使用委託並創建自己的StringBuilder類,該類使用java.lang.StringBuilder的實例作爲委託。這使得創建你自己的追加方法變得微不足道。

1

聲明爲final的類無法擴展,因此無法覆蓋它的任何方法。

未聲明final的類可以擴展,但是任何聲明爲final的方法都不能被覆蓋。