我正在阅读the docs并注意到它。永远不会想象它。说明:
此对象(已经是字符串!)本身已返回。
除了填充约定或使用计算资源之外,Java中的.toString()
对使用String
本身的String
执行的操作不会是什么?为什么不直接从类.toString()
继承java.lang.Object
?
编辑:
我理解在多态的情况下,必须存在自己的toString()
方法,因为它覆盖了它的父toString()
。我想在第一个问题中想知道的是,在使用stringVariable
/ "String value"
和使用stringVariable.toString()
/ "String value".toString()
之间是否存在任何不同之处。< / p>
实施例。 gr。:System.out.println(stringVariable.toString());
之类的输出操作或stringVariable = "String value".toString();
之类的值赋值。
答案 0 :(得分:35)
除了填充约定或使用计算资源之外,Java中的.toString()对使用String本身的String不会做什么?
这意味着它在多态调用时会给出适当的结果。
为什么不直接从java.lang.Object类继承.toString()?
因为这不会产生相同的结果,几乎肯定不会产生所需的结果。
Object.toString()
旨在为对象提供一个相当有用的字符串表示。 Object
实现提供了有关可用于粗略身份提示的类型和值的信息(在诊断上有用,但这就是全部)。这显然是不字符串最有用的字符串表示形式 - 字符串本身就是。
虽然我会说很遗憾toString
以一种非常粗暴的方式定义(目前尚不清楚结果是否适用于机器,开发人员或用户消费),对我来说很明显,String
会在实现中返回。
答案 1 :(得分:1)
实际例子:
public abstract class MetadataProcessor {
protected void processMetadata() {
Map<String, Object> metadata = getMetadata();
for(String key : metadata.keySet()) {
if(metadata.get(key) instanceof Date) {
processDate(metadata.get(key));
} else { //String or any other object type
processString(metadata.get(key).toString());
}
}
private void processDate(Date date) {
(...)
}
private void processString(String string) {
(...)
}
/**
* contains document's metadata, values must be String or Date
**/
protected abstract Map<String, Object> getMetadata();
}
如果String的.toString()不返回String本身,则上面的代码中需要额外的if(foo instanceof String)
。
答案 2 :(得分:1)
很明显,但是避免使用(foo instanceof String)的另一个答案是在处理泛型时。
获取每个对象的字符串表示形式会很烦人,但是字符串是奇怪的家伙,需要额外的代码才能获得相同的结果。
答案 3 :(得分:0)
在java中实现toString
方法是通过覆盖Object
的{{1}}方法完成的。当我们需要对象的字符串表示时,使用java toString
方法。它在toString()
类中定义。可以重写此方法以自定义Object
的{{1}}表示。
答案 4 :(得分:0)
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
请参阅:https://docs.oracle.com/javase/10/docs/api/java/lang/String.html
所有对象都有toString()
方法(请参阅https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#toString())。 String
是一种对象,因此,它还需要一个方法toString()
来从其基类实现方法。