• 締切済み

ArrayクラスとtoStringについて

問題集で次のプログラムを見掛ました。 public class Main{  public static void main(String args[]){   int[] array = new int[0];   System.out.println(array);  } } これを実行するとprintlnメソッドで toStringメソッドが呼び出されますが、 ArrayクラスはObjectクラスを継承しているため、 toStringメソッドもObjectクラスから継承されているので、 結果として、配列の要素数が0であっても、 エラー等が発生せずハッシュコードが表示される、ということです。 ObjectクラスのtoStringメソッドが ハッシュコードを返すものであるのは理解できます。 でも、なぜ要素数が1以上で何かしらの要素が存在する場合は、 ハッシュコードが返らないのでしょうか? 詳しい方、解説をお願いします。

noname#225019
noname#225019
  • Java
  • 回答数4
  • ありがとう数0

みんなの回答

回答No.4

ああ、文章をチャント理解してませんでした(^_^;) >なぜ要素数が1以上で何かしらの要素が存在する場合は、 >ハッシュコードが返らないのでしょうか? その認識が間違っていると言う事ですね。

回答No.3

>回答No.1 amanojaku1 javaの場合、配列だけでなく全てのオブジェクトがハッシュコードを持っているようです。 >System.out.println(array); ↑これは「System.out.println(array.toString());」と等価になるようで、「オブジェクト名+@+ハッシュコード」のような文字列が帰り値となるようです(ハッシュに関しては下記参照)。 ハッシュ関数 https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0

  • koakino
  • ベストアンサー率44% (22/50)
回答No.2

そのコードならarrayの要素数が1以上でもハッシュが表示されるはずですよ。

noname#225019
質問者

補足

回答ありがとうございます。 もう少し詳しく教えてもらえますか?

回答No.1

>ObjectクラスのtoStringメソッドが >ハッシュコードを返すものであるのは理解できます。 >でも、なぜ要素数が1以上で何かしらの要素が存在する場合は、 >ハッシュコードが返らないのでしょうか? >詳しい方、解説をお願いします。 あまり詳しくないですが(笑)、ハッシュコードと言ってるからには、恐らく配列のハッシュコードでしょう。 つまり(配列の要素数が0なので)「toStringメソッド」がハッシュコードを返しているのではなく、「Arrayクラス」がハッシュコードを返していると言う事しょう。

関連するQ&A

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

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

    • ベストアンサー
    • Java
  • Array.valueOf/toString

    Array オブジェクトの valueOf / toString メソッドは JavaScript ではあまり必要性がないように感じるのですが、実際にどのような使い方がされているのでしょうか。わたしのレベルではたとえばdocument.write(myArray)などで出力するのも myArray.toString() / myArra.valuOf()も変わらないのでなんでかな、とおもいます。

  • c#のToString()メソッド

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

  • クラスTest4を検出およびロードできませんでした

    import java.util.Arrays; public class Test4{ public static void main(String[] args){ int [] array = {298,827,8348,29,892,327,8,9,2,809,32}; System.out.println("配列の要素を表示します。"+ Arrays.toString(array)); System.out.println("Arraysクラスを利用しないと、" + array + "となってしまう"); } } kouzou@GD348ZZD9:/WORK$ java Test4 エラー: メイン・クラスTest4を検出およびロードできませんでした 原因: java.lang.ClassNotFoundException: Test4 コンパイルはできたのですが、実行でエラーが出ました。 何故でしょうか? 教えてください。 ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • Java
  • フィールドを持たないクラスが、値を保持できる理由

    なぜint型フィールドを持たないMyGenericsクラスが変数やリテラルを保持できるのでしょうか? Objectクラスのフィールドを持っていますが、Objectクラスも、 フィールドは持っていませんよね?メソッドも空のObject()しか持っていないですし。 一応、javadocを読んだのですが、読み方間違えていますか? http://dlc-cdn.sun.com/jdk/jdk-api-localizations/jdk-api-ja/builds/latest/html/ja/api/index.html --------------------code-------------------------------- public class MyGenericsTest { public static void main(String[] args) { int x = 234; MyGenerics g = new MyGenerics(x); Integer i = (Integer)g.get(); System.out.println(i); } } class MyGenerics { Object o; public MyGenerics(Object o){ this.o = o; } public Object get(){ return o; } }

    • ベストアンサー
    • Java
  • 計算クラスのメソッドについて

    <問題> Mainクラス mainメソッド 1)実行時に引数を2つ付けて実行する。(数字) 2)計算クラスのオブジェクトを生成。 3)argsの0番目と1番目から値を取得し、int型に変換する。 4)int型に変換した値2つを引数として、計算クラスの足し算メソ   ッドを実行し、戻り値を取得して表示する。 計算クラス 足し算メソッド(引数=int,int) 1)int型の数字を引数として2つ受け取る。 2)二つの引数の値を足し算する。 3)計算した値を戻り値とする。 *********************************************************** 上記の問題についての質問です。 最初mathくらすのメソッドを使うのかと思ったのですが、 足し算を計算するようなメソッドが無かったのでネットで検索 して見つけたcalcAdd()というメソッドを使って記述してみました。 でも「シンボルを見つけられません」のエラーが出てコンパイル 出来ないし、メソッドの使い方も違うような気がするので、 分かる方正しい記述の仕方を教えてください。 package siryou; class Keisan { int cal; int cul; public int tashizan(int a, int u) { cal = a; cul = u; int kekka = (Integer)calcAdd(cal, cul, 0); return kekka; } } class TashiHikiKakeWari { public static void main(String args[]) { Keisan ki = new Keisan(); String str1 = args[0]; String str2 = args[1]; int res1 = Integer.parseInt(str1); int res2 = Integer.parseInt(str2); ki.tashizan(res1, res2); int kekka = ki.tashizan(res1, res2); System.out.println(kekka); } } ************************************************************ calcAdd()メソッドの呼び出し方も間違っている気がするのですが、 そもそもこのメソッドって呼び出せば自動的に計算されるように なっているのですか? それとも足し算を計算する記述は別にしなければならないのでしょうか?

    • ベストアンサー
    • Java
  • C#で実行時にメソッドの返り値の型を変化させる

    C# で、実行時にメソッドの返り値の型を変化させることは可能でしょうか? たとえば、 public class MyData { object o; public void setValue( object a ) { o = a; } public object getValue() { return o; } } というクラスがあるとき、 static void Main(string[] args) { MyData a = new MyData(); a.setValue( 3 ); Console.WriteLine( a.getValue().GetType().ToString() ); int i = (int)a.getValue(); } というコードを実行すると、 System.Int32 と表示されます。Main の 4 行目で、(int)のキャストをはずすと、object から int への暗黙の変換はできませんというコンパイルエラーになります。 この(int)のキャストをしなくてもエラーにならないような getValue の関数はできないでしょうか? o は、数値型であるとします。 たとえば、MyData に、 public int getInt() { return (int)o; } とすれば、必ず int を返すようなメソッドはできると思うのですが、これだと、getByte() や、getDouble() などのように、考えられるすべての型を想定してメソッドを作ることになってしまいます。 そうではなく、getValue() で、少なくとも数値型の暗黙の変換はしてくれるようなことにできないでしょうか。 よろしくお願いします。

  • 構造体がObjectクラスを継承していることについて

    本を読んでいましたら、構造体はObjectクラスを継承している とありました。 実際構造体を定義して使用してみると、 「ToString」メソッドが存在するなどで、継承されているのだな と思うのですが、 構造体はObjectクラスを継承しています という情報はどのように確認すれば良いのでしょうか? 同じようにクラスがどのクラスを継承していますという情報も確認できたら嬉しいです。 Structure ステートメントのヘルプを見ても載っていないように感じました。 確認方法が知りたいです。 もし宜しければ、ご回答お願い致します。

  • クラスメソッドのみのクラスのオブジェクト生成は不可??

    あるテキストのjavaの問題です。 public class Draw{   static void pixel(int x,int y){     /*座標(x、y)に点を描画*/   }   static void line(int x1,int y1,int x2,int y2){     /*座標(x1、y1)~(x2、y2)に線を引く*/   } } で、これを実行するための以下のようなクラス public class TestDraw{ <ここに入力> } という問題なのですが2つまでは絞れたのですが、 (1) public static void main(String args[]){   Draw d = new Draw().line(10,10,20,30); } ↑× (2) public static void main(String args[]){   Draw.line(10,10,20,30); } ↑○ (2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが (1)も正解のような気がするのですが・・・ 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。 どうもいまいち理解できません。 クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない ということなのでしょうか? それからちなみに、public classって2つ記述できないんではありませんでしたか?

    • ベストアンサー
    • Java
  • Javaのプログラムに関する質問です。

     以下のプログラムはコマンドライン引数で複数の数字を  受け取り、int型配列arrayに受け取った値を代入して  arrayの先頭から順番に表示しています。    変換クラスと、表示クラスを作成し  (1)の部分を変換クラスで、  (2)の部分を表示クラスで行うように修正してください。 */ class ClassAdd08{  public static void main(String[] args){   HenkanClass subA = new HenkanClass();//HenkanClassのインスタンス化   subA.henkan(len,array);//変換メソッドの呼び出し   HyoujiClass subB = new HyoujiClass();//HyoujiClassのインスタンス化   subB.hyouji();//表示メソッドの呼び出し  } }   //****************************     (1)     ********************************** class HenkanClass{//変換クラスを新規作成  public void henkan(){//変換メソッド   int len = args.length;   int[] array = new int[len];   for(int i = 0; i < len; i++){    array[i] = Integer.parseInt(args[i]);   }  } }    //****************************     (1)     **********************************    //****************************     (2)     ********************************** class HyoujiClass{//表示クラスを新規作成  public void hyouji(){//表示メソッド   System.out.println("受け取った引数:" + len + "個");      for(int i = 0; i < len; i++){    System.out.println((i + 1) + "個目の数:" + array[i]);   }  }   //****************************     (2)     ********************************** } クラスのインスタンス化と、対応するメソッドまでは作成したのですが、その後どうすればいいか分かりません。考え方やヒントなど、皆様の知恵をどうかお貸しください。お願い致します。

専門家に質問してみよう