次のように配列リストを定義しました。
ArrayList<Node> nodes = new ArrayList<Node>();
Node は、1 つの文字を格納するための 1 つの文字データ型を持つクラスです。
出力には、文字を印刷する代わりにガベージ値が表示されています。
コードスニペットを次に示します。誰でも理由を説明できますか?
for(Node d : nodes){
System.out.println(d);
}
次のように配列リストを定義しました。
ArrayList<Node> nodes = new ArrayList<Node>();
Node は、1 つの文字を格納するための 1 つの文字データ型を持つクラスです。
出力には、文字を印刷する代わりにガベージ値が表示されています。
コードスニペットを次に示します。誰でも理由を説明できますか?
for(Node d : nodes){
System.out.println(d);
}
クラスはメソッドNode
をオーバーライドしません。toString
そのため、デフォルトの実装が呼び出され、「ガベージ」のように見えるものを生成します。
クラスに、パラメーターをとらず、アプリケーション固有の方法でノードのコンテンツを記述するを返すメソッドをNode
追加します。これにより、出力が修正されます。toString
String
ArrayList をサブクラス化し、toString メソッドをオーバーライドしない限り、単に ArrayList で println を呼び出すだけで、arraylist の実際の内容ではなく、オブジェクト参照のアドレスが出力されます (これは表示されているガベージです)。目的の結果を得るには、次を使用します。
System.out.println(Arrays.toString(nodes.toArray());
ところで-他の人々は正しいです。ノードクラスの toString() メソッドもオーバーライドする必要があります(一般に、設計するクラスの toString() メソッドをオーバーライドすることは常にベストプラクティスです)。
以下のコメントで言及した問題に対処するには:
public String toString(){
return Character.toString(label);
}
System.out.println(d)
と同等ですSystem.out.println(d.toString())
toString()
クラスでメソッドを再定義しなかった場合Node
、Java はtoString()
オブジェクトが継承したクラスのメソッドを使用します。
デフォルトでは、すべてのクラスObject
は、toString()
メソッドが次のように定義されているスーパークラスを継承します。
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
だから「ゴミ」に見える