我对StringBuilder类中的append方法有疑问。我被问到如何在StringBuilder类中最后覆盖StringBuilder类中的append()方法。当String类是final时,同样的逻辑适用于在String类中重写toString()吗?请帮帮我。
由于
答案 0 :(得分:4)
不,你不能真正覆盖final
方法,可能会有一些字节码级魔法允许你这样做,但我不确定它是否值得。
您可以创建一个包装类,类似于MyStringBuilder
,并为StringBuilder
中的每个方法创建一个委托给StringBuilder
实例的方法,然后您可以修改您认为合适的append
方法。这种方法有一个问题,那就是你无法访问private
中定义的StringBuilder
变量,尽管这对你的用例来说可能不是什么大问题。 YMMV
答案 1 :(得分:1)
声明final
的类无法扩展,因此无法覆盖它的任何方法。
可以扩展未声明为final
的类,但不能覆盖任何声明为final
的方法。
答案 2 :(得分:0)
覆盖String类中的toString会覆盖java.lang.Object
中java.lang.String
的方法。由于该类被声明为final,因此无法从中派生,因此不会覆盖toString-method,这是String中的一个特例,因为它返回String本身。
在最终课程中覆盖方法是不可能的。并且append ()
不是Object中的方法,因此它们不等效,但您也不能覆盖append。
答案 3 :(得分:-1)
这些课程是最终的设计。 API设计者不想处理使这些类成为继承的基类的额外复杂性。
您可以使用委托创建自己的StringBuilder类,而不是继承,该类使用java.lang.StringBuilder的实例作为委托。这使得创建自己的追加方法变得微不足道。