20

I was reading the docs and noticed it. Never imaginated it. The description:

This object (which is already a string!) is itself returned.

Besides filling conventions or using computing resources, what does a .toString() in Java do on a String that using the String itself wouldn't? Why doesn't it simply inherit the .toString() from class java.lang.Object?

EDIT:

I understand that in situations of polymorphism an own toString() method has to exist since it overrode its parent's toString(). What I want to know in the first question is if there is any situation where you'll get something different between using stringVariable/"String value" and using stringVariable.toString()/"String value".toString().

Ex. gr.: An output operation like System.out.println(stringVariable.toString()); or a value assignment like stringVariable = "String value".toString();.

4

5 に答える 5

39

規則を満たしたり、コンピューティング リソースを使用したりする以外に、Java の .toString() は String に対して何を行い、String 自体は使用しないのでしょうか?

これは、ポリモーフィックに呼び出されたときに適切な結果が得られることを意味します。

クラス java.lang.Object から単に .toString() を継承しないのはなぜですか?

それは同じ結果が得られず、ほぼ確実に望ましい結果が得られないためです。

Object.toString()オブジェクトの合理的に有用な文字列表現を提供することを意図しています。実装は、Object大まかな ID ヒントに使用できる型と値に関する情報を提供します (診断には役立ちますが、それだけです)。これは明らかに、文字列の最も有用な文字列表現ではありません。文字列自体がそうです。

残念なことに、非常に愚かな方法で定義されてtoStringますが (結果がマシン、開発者、またはユーザーの消費を意味するかどうかは明らかではありません)、String実装で a がそれ自体を返すことは明らかだと思います。

于 2012-07-08T20:26:33.920 に答える
2

実際の例:

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)場合は、上記のコードで追加が必要になります。

于 2016-11-21T13:04:38.170 に答える
0

Java でのメソッドの実装は、のメソッドtoStringをオーバーライドすることによって行われます。オブジェクトの文字列表現が必要な場合は、Javaメソッドを使用します。クラスで定義されています。このメソッドをオーバーライドして、 の表現をカスタマイズできます。ObjecttoStringtoString()ObjectStringObject

于 2016-08-17T05:11:52.553 に答える