编辑: 我知道我应该覆盖默认行为,这就是为什么我提到实现 :)。我确实理解在某些需要GUI内字符串表示的组件中覆盖它的价值。但是,在至少JDK中,我看到很多只有在需要调试对象实例时才会用到的实现。
为什么它源自Object类,因为它似乎只对GUI /调试等东西有用?是否还有其他用途我不知道?
不,关键在于你应该覆盖默认的ToString()
实现,以使其有用。 ToString()
可以是将某些东西的值输出回UI的好方法。
一个简单的例子是,如果您有一个名称类(Name Class)其中包含三个字符串(First, Middle, Last),您可以有一个ToString()
方法将其格式化为UI:“Last, First Middle”。
或者一个存储数学运算的类(Left=2,Right=3,Result=6和一个操作符枚举=Multiply),调用ToString()
可得到“2 * 3 = 6”。
然而,通常更常见的是具有各种不同To<qualifier>String()
方法,例如.NET中的DateTime
类。(ToShortDateString()
,ToLongDateString()
,ToLongTimeString()
,...)
编辑:至于为什么它是根据Object
类显示,那只是因为ToString()
对于任何事物都是一个有效的操作。
此外,字符串可以是在数据类型或数据使用者之间进行编组的好方法,因为它(实际上)保证可解析并且不需要额外的编码或注意。
我的个人偏好是,永远不要将toString()用于除调试之外的任何事情。 如果您想为对象生成字符串,请提供一个明确记录您意图的单独方法(例如getName()、getDescription()等)。永远不要依赖toString()的实现。
问题在于,许多开发人员将toString()视为调试级别的字符串,并且认为随意更改它(例如添加或删除字段)没有什么问题。还有一些自动化的toString()构建器使用反射从字段生成toString()。
我发现这种偏好多年来一直为我服务良好。
toString()方法在需要获取对象的字符串表示时非常有用。它通常用于调试,但也可以用于向用户输出操作结果。
例如,假设您有一个处理复数的Complex类。如果您想以3 + 2i这样的格式将它们打印给用户,那么定义toString()会很方便,因为您不必每次都编写格式,而且输出结果将是一致的。如果您想要更改该表示方式,例如更改为3 + 2j,则只需修改Complex类中的toString()方法即可。
因此,toString()并不仅限于调试目的,而且还是获得对象一致字符串表示的好方法。
toString()
文本未国际化,因此这个文本对用户是否有用还是值得怀疑的。 - RaedwaldtoString
方法应返回对象的可读文本表示。
这个问题在Effective Java中被提到,作为条款10:总是重写 toString
。
它引用了 Java API Specification 的 Object.toString
方法:
除了调试之外,覆盖类的结果应该是简洁但信息丰富的表示形式,易于人类阅读。
toString
方法在将对象添加到JList
或JTable
中时也很有用,这些默认情况下会使用toString
方法在列表或表格中以文本形式显示对象。JList
中的对象的toString
方法,这样用户就可以通过GUI在列表中看到有关该项的信息。toString
方法是有用的。关键是使toString
方法返回对人有用的信息,而不是使用对象的内存位置作为其文本表示的默认Object.toString
实现。适用于
以及任何其他字符串输出。
var new1DArray:Array = the2DArray.toString().split(",");
你可能会感到惊讶,但它实际上正在按预期工作,并且速度相当快!
除了其他人已经说过的,重写ToString()在使用调用它的控件时也非常有用。例如,ComboBox:
myComboBox.Items.Add(new MyClass());
// now, whatever ToString() returns is shown in the
// ComboBox, but you can get the object back by through
// the SlectedItem property.