- ベストアンサー
[C@3331394などの文字列
Stringを表示させようとして[C@3331394などという文字列("[C@"以下の数字は毎回変わります。)が意図せず出てきてしまい、困っています。これはメモリ番地とかでしょうか?どなたかこのような文字列を見かけたことのあるかた、教えてください。 ちなみにezplusのエミュにてauアプリを開発しています。 http通信をしてサーバから文字列を取ってきて、それを表示する練習用のプログラムを書いてまして、その文字列が問題の文字列になってしまいます。 エミュでも、携帯実機でも出てきてしまいます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
クラスの型が違うという言い方は正確じゃないなぁ。 toString()メソッドがオーバーライドされていないと、そういう文字列になるわけです。 java.lang.Object クラスの toString() の実装は、 「クラス名 + @ + ハッシュコード」 を返すようになっています。Object の toString() をオーバーライドしないサブクラスも、もちろん同様に 「クラス名 + @ + ハッシュコード」 を返します。例えば、配列クラスです。(前の回答者の例) 逆に、toString() が『まともな』文字列を返す場合というのは、そのオブジェクトのクラスが toString() メソッドをオーバーライドしている場合です。例えば String クラスの toString() を呼び出すと文字列そのものが返されますが、それは String クラスが toString() メソッドをオーバーライドしているからですね。
その他の回答 (2)
- UKY
- ベストアンサー率50% (604/1207)
> ちなみにSystem.out.println(xxx)では、実はいつもtoString()メソッドが呼び出されているんでしょうか・・。 そうです。なので、 System.out.println(xxx); と System.out.println(xxx.toString()); は基本的に同じです。 (ただし、xxxがnullのときやプリミティブ型の場合など、一部例外があります)
お礼
勉強になります。 クラス継承ですねえ。Javaテクノロジーの一端を垣間見れました。 ありがとうございました!
クラスの型が違うのではないでしょうか? 例えば、取り出したオブジェクトは配列なのに、それをStringとして表示しようとしているとか。 例えば、大本が String[] str = new String[]{"あ","い","う"}; であり、それが取ってきたオブジェクトの内に入っているとして、取り出した側で表示するときに System.out.println(str); とかやってしまうと、表題のような変な文字列になるはずです。 つまりは、クラスキャストが間違っているわけです。 引数がObjectクラスなんかだとよくやらかす間違いなので、取ってきたオブジェクトが何かをきちんと把握していないといけません。 以下のサンプルで実行すれば、同じような出力になるのがわかると思いますが。 public class strtest { public static void main(String[] args) { String[] str = new String[]{"あ","い","う"}; System.out.println(str); } }
お礼
ありがとうございます。 参考になりました! クラスの型がちがうんですねぇ。 見直してみます。
お礼
ありがとうございます。 なるほど、 確かにこちらのソースで、確かにtoString()メソッドを使用しています。 で、toString()を使用した対象オブジェクトにおいて、そのオブジェクト向けのtoString()がちゃんとオーバーライドされていないから「クラス名 + @ + ハッシュコード」が表示されてしまうんですね。 ちなみにSystem.out.println(xxx)では、実はいつもtoString()メソッドが呼び出されているんでしょうか・・。 とても参考になりました!ありがとうございました!