質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

3回答

10463閲覧

toStringメソッドのオーバーライドについて

kisaragizinzin7

総合スコア90

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/03/25 08:21

javaの参考書などをみているとtoStringメソッドをオーバーライドして使っているのがあるのですが、これは何の意味があるのでしょうか?

toStringメソッドは
①Objectクラスに属するメソッド
②インスタンスの内容を文字列表現にして返すメソッド
③クラス名@ハッシュ値」というあまり役に立たない情報しか返さないメソッド
ということはわかりました。

http://www.milk-island.net/document/java/kihon/k3/
を内容を借りています。

コード public class Dog { String name; //名前 int cryCount; //鳴く回数 /** * コンストラクタ。 * @param name 名前 * @param cryCount 鳴く回数 */ public Dog(String name, int cryCount) { this.name = name; this.cryCount = cryCount; } } public class K303 { /**メインメソッド。*/ public static void main(String[] args) { // インスタンスを作成 Dog dog1 = new Dog("クロ", 5); // Dogインスタンスの内容を表示 System.out.println("変数 dog1の参照先インスタンスの内容は " + dog1); } }

この結果は
変数 dog1の参照先インスタンスの内容は toStringメソッド.Dog@1db9742
になります。

コード public class Dog { String name; //名前 int cryCount; //鳴く回数 /** * コンストラクタ。 * @param name 名前 * @param cryCount 鳴く回数 */ public Dog(String name, int cryCount) { this.name = name; this.cryCount = cryCount; } @Override public String toString() { return "[" + name + ":" + cryCount + "]"; } } public class K303 { /**メインメソッド。*/ public static void main(String[] args) { // インスタンスを作成 Dog dog1 = new Dog("クロ", 5); // Dogインスタンスの内容を表示 System.out.println("変数 dog1の参照先インスタンスの内容は " + dog1); } }

これの結果は
変数 dog1の参照先インスタンスの内容は [クロ:5]
になります。
オーバーライドしているのでこのような結果になるのはわかるのですが、これはなにかメリットがあるのでしょうか?
また、

コード public String str() { return "[" + name + ":" + cryCount + "]"; } // Dogインスタンスの内容を表示 System.out.println("変数 dog1の参照先インスタンスの内容は " + dog1.str());

上のようにDogクラスのオーバーライドしたtoStringメソッドをstrメソッドに変えて、K303クラスの("変数 dog1の参照先インスタンスの内容は " + dog1);を("変数 dog1の参照先インスタンスの内容は " + dog1.str());に変更しても同じ結果を得られるのでtoStringメソッドを使わなくてもいいように思います。

toStringメソッドを使う理由、toStringメソッドではいけない理由が何かあるのでしょうか?
toStringメソッドを使う理由、メリットを教えていただきたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

操作の方法を1つにまとめられるというのが大きなメリットです。
オーバーライドせず、めいめいのクラスで好き勝手な文字列化メソッドを実装した場合、

オブジェクトを文字列として出力するにあたり、このオブジェクトはこのメソッドで、あのオブジェクトはあのメソッドで、あれ、それはなんてメソッドだっけ?

ということになり、非常に使い勝手が悪いです。
すべての参照型が持っているtoStringを書き換えたほうが、操作を統一できて便利なのです。

また、独自の文字列化メソッドを実装した場合のデメリットとして、定義したクラスの親クラス型では使えないことも挙げられます。
例のDogクラスの場合、Dog型ならstrメソッドが使えますが、Object型の変数に入った場合に使えなくなります。
ObjectのメソッドtoStringならそんなことはなく、いつでも使うことができます。

投稿2017/03/25 08:27

編集2017/03/25 08:40
swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2017/03/27 01:52

回答ありがとうございます。 わかりやすい解説ありがとうございます! そういう利点があったんですね。
swordone

2017/03/27 01:55

副次的な効果になりますが、Eclipseではデバッグ画面でオブジェクトの表示がtoStringの結果になるので、デバッグしながら中身がわかるというのもあります。
guest

0

toString() メソッドを実装するメリットは、貴方ではなく Dog クラスを利用する他の開発者が享受できるのだ、と考えるとよいでしょう。

インスタンスの文字列表現を得たいと思うことはしばしばあるので、貴方が設計した Dog クラスを利用する私はインスタンス Dog taro; を例えばファイルに出力するために、taro.toString() としたいわけです。

Java の流儀ではインスタンスの文字列表現を取得する場合は Object#toString() を使うと作法が決まっているわけです。決まっていると「私」が助かるわけです。期待した結果が得られず、Dog クラスのドキュメントを読んで str() メソッドを使う必要があることに驚いたりしたくはないのです。

投稿2017/03/25 14:37

koko_u

総合スコア936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2017/03/27 00:44

回答ありがとうございます。 toStringメソッドを使うのが決まっているんですね! ちなみにですが、「インスタンスの文字列表現を得たいと思うことはしばしばある」というのは「toStringメソッド.Dog@1db9742」こういう結果が欲しいときがあるということですか?それともインスタンスの引数が欲しいということなのでしょうか?
koko_u

2017/03/27 13:06

> 「toStringメソッド.Dog@1db9742」こういう結果が欲しいときがあるということですか? いいえ。 単純に Dog のインスタンスを例えば Web画面に表示したい、と思ったときに欲しくなる文字列のことを言っています。 「文字列表現を得たい」という "要件" を表現しているのが、Object#toString() メソッドで、これを継承した Dog クラスで「文字列表現を得る」ための実装を "あなたが" オーバーライドすることを Java の API では想定している。ということです。 なので、Dogクラスを利用する側も「文字列表現を得るなら Dog#toString() だろう」と考えて使うわけです。
guest

0

例えば、以下のように考えて見てはどうでしょう

クラスDogの中身だけ表示したい場合、変数の文字長さを最短の一文字にすると

何と、toString()を用いて表示した場合、str()を用いて表示する場合に対して、System.out.println()内に入力する文字が七分の一で済むのです

str()ではまだ長いからとメソッド名を一文字にしてs()にした場合と比べてすら、System.out.println()内に入力する文字は五分の一で済みます

それらは冗談のようなものだとしても、

あるクラス内のデータを複数回表示したくて何度も何度もその内容を表示するためのコードの入力を繰り返す場合、toString()は入力文字数の合計を自作メソッドを使う場合に対して毎回につき最短(メソッド名がs()など一文字の場合)でも四文字ずつ減らしてくれる実に効率的な仕組みだとは思いませんか・・・
もし、Javaにおける「int」が、四文字も多い「integer」だったとしたら、
毎回毎回int変数を宣言するたびに

integer c=22;
integer d=33;
・・・
と書かねばならなくなりますが、
それよりははるかに今の「int」の方が短くて打ち込みやすく使いやすいとは思いませんか・・・

ましてや上で示されている、「str()」を用いるとしたら毎回につき6文字増えますが、
「int」が六文字多い「intnumber」だったとして、

intnumber a=11;
intnumber b=22;
・・・
と毎回書かねばならない言語とか地味に辛くはないですか・・・

intは頻繁に使うのに対し、クラスの内容を表示するのはそんなに使わないから多少長くとも構わないように思うかも知れませんが、頻繁に使うと明らかに効率的だと分かってくるものは少しだけ使う場合もやはり同様に効率的なはずです
また、長大なプログラム内で何度もクラス内容を表示する場合は当然この効率化によってかなり全体として打ち込みが楽になるはずです

「寿限無」という、長すぎる名前は最早日常的に使うための用をなさなくなりかねない現実を示す昔の話がありますが、名前が少しでも短くて済む方法があるならそれを使うに越した事はないのではないでしょうか

java

1 class Dog { 2 3 String name; //名前 4 int cryCount; //鳴く回数 5 6 /** 7 * コンストラクタ。 8 * @param name 名前 9 * @param cryCount 鳴く回数 10 */ 11 public Dog(String name, int cryCount) { 12 this.name = name; 13 this.cryCount = cryCount; 14 } 15 16public String str() { 17 return "[" + name + ":" + cryCount + "]"; 18 } 19 20public String s() { 21 return "[" + name + ":" + cryCount + "]"; 22 } 23 24 25 @Override 26 public String toString() { 27 return "[" + name + ":" + cryCount + "]"; 28 } 29 30} 31 32 33public class K33 { 34 35 /**メインメソッド。*/ 36 public static void main(String[] args) { 37 // インスタンスを作成 38 Dog a = new Dog("クロ", 5); 39 40 // Dogインスタンスの内容を表示 41 System.out.println(a);//()内が一文字で済んだ 42 System.out.println(a.str());//()内は七文字も必要 43 System.out.println(a.s());//()内は五文字必要 44 45 } 46 47}

投稿2017/03/25 09:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/03/25 16:48

文字列連結や出力がtoString()を参照することによる副次的効果にしか見えないです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問