0

次のように配列リストを定義しました。

ArrayList<Node> nodes = new ArrayList<Node>();

Node は、1 つの文字を格納するための 1 つの文字データ型を持つクラスです。

出力には、文字を印刷する代わりにガベージ値が表示されています。

コードスニペットを次に示します。誰でも理由を説明できますか?

for(Node d : nodes){
    System.out.println(d);
}
4

3 に答える 3

2

クラスはメソッドNodeをオーバーライドしません。toStringそのため、デフォルトの実装が呼び出され、「ガベージ」のように見えるものを生成します。

クラスに、パラメーターをとらず、アプリケーション固有の方法でノードのコンテンツを記述するを返すメソッドをNode追加します。これにより、出力が修正されます。toStringString

于 2013-04-07T10:45:07.673 に答える
0

ArrayList をサブクラス化し、toString メソッドをオーバーライドしない限り、単に ArrayList で println を呼び出すだけで、arraylist の実際の内容ではなく、オブジェクト参照のアドレスが出力されます (これは表示されているガベージです)。目的の結果を得るには、次を使用します。

System.out.println(Arrays.toString(nodes.toArray());

ところで-他の人々は正しいです。ノードクラスの toString() メソッドもオーバーライドする必要があります(一般に、設計するクラスの toString() メソッドをオーバーライドすることは常にベストプラクティスです)。

以下のコメントで言及した問題に対処するには:

public String toString(){
   return Character.toString(label);
 }
于 2013-04-07T10:44:20.690 に答える
0

System.out.println(d)と同等ですSystem.out.println(d.toString())

toString()クラスでメソッドを再定義しなかった場合Node、Java はtoString()オブジェクトが継承したクラスのメソッドを使用します。

デフォルトでは、すべてのクラスObjectは、toString()メソッドが次のように定義されているスーパークラスを継承します。

public String toString() {
      return getClass().getName() + "@" + Integer.toHexString(hashCode());
   }

だから「ゴミ」に見える

于 2013-04-07T10:48:42.070 に答える