• ベストアンサー

toString()メソッドについて2

toString()メソッドは、自分で設計したクラスで定義しておく(オーバーライドする)とより便利です。「Car@数値」よりももっとわかりやすい文字列を返すようにすることができるからです。 とある本に書いてありますが、オーバーライドするとわかりやすい文字列を返すとは どういう意味でしょうか?

  • Java
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • hirotn
  • ベストアンサー率59% (147/246)
回答No.3

なぜ、Car@数値と返すのか、以前のQAのコメントの回答と合わせて回答申し上げます。 equals()メソッドの継承について http://okwave.jp/qa/q8231651.html 上記質問では、「ObjectクラスのqeualsメソッドとStringクラスのequalsクラスは(オーバライドしているので)処理が異なる」という回答を致しました。 そこで頂いたコメントですが、 >スーパークラスは必然的に object になるという意味ですか? Javaでは「Yes」になります。lava.lang.Object クラスになります。 Car@数値 というのは、Objectクラスで定義されたデフォルトのtoStringメソッドを実行した結果になっています。 http://docjar.com/src/api/java/lang/Object.java (場所はtoStringで検索してください) しかし、StringクラスのtoStringでは、文字列が返るようになっています。やはりオーバーライドして便利にしているのです。 ですから、CarクラスのtoStringを独自に定義して、車名、車種名、を事由に返すことができるようになるというのが、本の記述にある「より便利」ということなのだと思います。

KAIJI-000
質問者

お礼

継続的な回答有難うございます。学習の参考とさせていただきます。

その他の回答 (2)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

ご自身の質問である,以前のQ&Aのベストアンサーも参照。 toString()メソッドについて http://okwave.jp/qa/q8231630.html ということで。 car1.toString() を呼び出したら既定の機能を通じて「Car@数値」と表示された。これは分かりにくいなあとお感じになったなら。 「Car@数値 というのは○○という意味なんです。こう説明してあげる方が初心者にもうれしいと思ったので,KAIJI-000がこのメッセージ文を作りました」 などといったような,もっとわかりやすい文字列を返すように,自分で設計したCarクラス内で toString()メソッドの機能を新たに上書き(override)しておくとより便利ですよ。と言っているわけです。

KAIJI-000
質問者

お礼

以前との絡みの回答有難うございました。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

たとえば、 public class Car {  private String name;  private double speed;  public Car(String name, double speed) {   this.name = name;   this.speed = speed;  }  public static void main(String[] args) {   Car car = new Car("Chihaya type-B", 72.0);   /* ……なんだかわからない処理…… */   /* ここでのcarの内容を知りたい */  } } というコードがあって、なんだかわからない処理の中でcarインスタンスがどのように変化したかを知りたい場合、toString()がオーバーライドされていない場合はその出力は Car@557e5cbd という感じになります。これではcarに設定されているはずのnameやspeedの値がわかりませんね。そのためいちいちnameとspeedを出力する必要が出てきます。「なんだそれだけか」とお思いでしょうが、そのあと全長を保持するようにCarクラスが変更された時に忘れずに表示部分でも全長を表示しなくてはなりません。 一方、toString()を適切にオーバーライドした場合、例えば @Override public String toString() {  return "Car : name = \"" + name + "\", speed = " + Double.toString(speed); } という風にオーバーライドしているならば、car.toString()を呼び出すだけでcarの内容を知ることができます。さらに、上記の変更があった場合も内容表示のために修正すべき個所はtoString()だけになります。

KAIJI-000
質問者

お礼

早速の丁寧な回答有難うございます

関連するQ&A

  • toString()メソッドについて

    ある本に、 ------------------------------------------------------------------------- System.out. println(car1); 特に何も準備せずに上のコードを記述すると、Objectクラスから継承したtoString()メソッドが呼び出されます。 そしてこのtoString()メソッドの戻り値となっている「Car@数値」という文字列が画面に出力されるようになっているのです。 ------------------------------------------------------------------------- と書いてありましたが、toString()メソッドの戻り値となっている「Car@数値」という文字列が画面に出力とはいったいどういう意味でしょうか?

    • ベストアンサー
    • Java
  • c#のToString()メソッド

    http://msdn.microsoft.com/ja-jp/library/ms173154(v=vs.90).aspx のページによると C# では、すべてのオブジェクトが ToString メソッドを継承します。このメソッドは、該当するオブジェクトの文字列形式を返します。たとえば、int 型の変数はすべて ToString メソッドを持ち、次のようにその変数の内容を文字列として返すことができます ↑と書いてあるのですが、C言語しか知らない自分にとってint型の変数が関数、メソッドを持つ、 という概念が理解できません。これはオブジェクト指向の話なのでしょうか?クラスを理解すると わかるようになりますか? どなたかよろしくお願いします。

  • 抽象メソッド、抽象クラス

    C#を勉強しております。Javaにも同じ機能がありC#のカテゴリーがない為こちらで質問させていただきます。抽象メソッドや抽象クラスを使う利点に関してです。 これらを使う利点を調べたところオーバーライドさせられると書いてありました。オーバーライドしないと 実装がないのでエラーになると書いてありました。その点は理解できたのですが何故基本クラスで実体のない定義をする利点がよくわかりません。それなら最初から派生クラスの方にメソッドを定義すればいいのではという考えになりました。 抽象メソッドとして実体のない定義を行う利点なるものを教えてください。 よろしくお願いします。

  • equals()メソッドの継承について

    ある本に ーーーーーーーーーーーーーーーーーーーーー class Car { protected int num; protected double gas; public Car() { num = 0; gas = 0.0; System.out.println("車を作成しました。"); } } class Sample8 { public static void main(String[] args) { Car car1 = new Car(); Car car2 = new Car(); Car car3; car3 = car1; boolean bl1 = car1.equals(car2); boolean bl2 = car1.equals(car3); System.out.println("car1とcar2が同じか調べたところ" + bl1 + "でした。"); System.out.println("car1とcar3が同じか調べたところ" + bl2 + "でした。"); } } JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来るわけです。 ----------------------------------------- JavaのクラスはすべてObjectクラスのメンバを継承していますので、equals()メソッドを記述しなくても、このメソッドを呼び出すことが出来る    についてですが、 逆から言えば他の言語の場合は本来クラスの宣言の辺りにでもequals()メソッドを記述する必要があるという意味なんでしょうか?

    • ベストアンサー
    • Java
  • StratsのActionクラスのexecuteメソッドは何故abstructじゃないの?

    StratsのActionクラスのexecuteメソッドは何故abstructではないのでしょうか? Actionクラスを実装するのであれば必ずexecuteを実装すると思います。 なので必ずexecuteメソッドをオーバーライドすると思います。 既に実装してあっても意味がないのではないかと感じました。

    • ベストアンサー
    • Java
  • 匿名クラス内のメソッドをオーバーライド。実引数はいつどこから来るのでしょうか?

     お世話になっております。 匿名クラス内のメソッドをオーバーライドするときの引数についての質問なのですが File d = new File("F:\\dir"); File[] d2 = d.listFiles(new FileFilter(){ public boolean accept(File hoge){ return hoge.toString().endsWith(".txt"); } } ); オーバーライドしたacceptメソッドの仮引数のFile型のhogeがありますが このacceptメソッドの実引数はいつどこから来るのでしょうか? このacceptメソッドの実引数はどこで「acceptメソッドの呼び出し」で指定すればよいでしょうか? その他ActionEvent e などの仮引数も謎です。 どうかよろしくご指導お願いいたします。

    • ベストアンサー
    • Java
  • 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」

    「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{   void show(); } class A{   public void show(){     System.out.println("A");   } } class B extends A implements X{ } public class Main{   public static void main(String[] args){     X x=new B();     x.show();   } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16

    • ベストアンサー
    • Java
  • オーバーライドについて

    はじめまして。 変な質問ですみませんが質問させてください。 オーバーライドの定義についてなのですが、 オーバーライドとは、スーパークラスで定義した、メソッドの メソッド名と戻り値のデータ型と引数の数とそのデータ型が等しい メソッドをサブクラスで定義することであると、 認識しているのですが、間違いでしょうか、 特に、戻り値のデータ型はスーパークラスとサブクラスとで同じでなけ ればならないんですよね? ご教授お願いします。

    • ベストアンサー
    • Java
  • 【アクセス修飾子】アクセス修飾子無しのクラスにpublicなメソッド

    アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。 class MyClass {  public void method() {} } 例えばこのようなクラスがあったとします。 このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。 何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか? 御教授よろしくお願いします。

    • ベストアンサー
    • Java
  • クラス変数とクラスメソッドを教えてください

    みんさんどうもすみません。クラス変数とクラスメソッドなんですが、 何回本を読んでもイマイチ理解できません。クラス変数とクラスメソッド を使うことでなにがメリットなのか教えてください。例えばクラスメソッド の場合はメソッド名の前にオブジェクト名をつけなくていいとか、そういう 便利さのために使うんでしょうか?どうもまだ完全に理解できていないの で詳しい方いらっしゃったらどうか教えてください。よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう