2011-04-01 22 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的方法都不能被覆盖。