8

次のことを行うと、出力が正確に何であるかを知りたいです。

class Data {
  int a = 5;
}

class Main {
  public static void main(String[] args) {
    data dObj = new data();
    System.out.println(dObj);
  }
}

私の場合の出力はdata@1ae73783であるため、オブジェクトに関連する何かが得られることはわかっています。1ae73783は16進数だと思います。私もいくつかの回避策を行い、印刷しました

System.out.println(dObj.hashCode());

番号415360643を取得しました。整数値を取得しました。1ae73783を10進数hashCode()に変換すると、好奇心から何が返ってくるのかわかりませんが、 415360643になりました。

だから私はこの数字が正確に何であるかについて興味があります。これはJavaのサンドボックスのメモリ位置ですか、それとも他のものですか?

4

4 に答える 4

18

何が起こるかというとtoString()、クラスのデフォルトのメソッドが使用されているということです。このメソッドは次のように定義されます。

classのtoStringメソッドObjectは、オブジェクトがインスタンスであるクラスの名前、アットマーク文字 `@'、およびオブジェクトのハッシュコードの符号なし16進表現で構成される文字列を返します。つまり、このメソッドは次の値に等しい文字列を返します。

getClass().getName() + '@' + Integer.toHexString(hashCode())

デフォルトのhashCode()メソッドによって返される値は、実装固有です。

合理的に実用的である限りhashCode、クラスによって定義されたメソッドObjectは、個別のオブジェクトに対して個別の整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装手法はJavaTMプログラミング言語では必要ありません。)

于 2012-11-21T16:56:21.397 に答える
4

toStringメソッドをオーバーライドしないクラスのインスタンスを出力すると、クラスのtoStringメソッドObjectが使用されます。次の形式で出力を出力します:-

data@1ae73783
  • その最初の部分はoutput、オブジェクトのタイプを示しています。

  • そして2番目の部分は、hashCode オブジェクトの16進表現です。

Object.toString()メソッドのソースコードは次のとおりです。これは、のインストールディレクトリのフォルダjdkの下にあります。-src

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
于 2012-11-21T16:57:38.820 に答える
3

クラス内のhashCode()およびtoString()のJavadocは、Objectこれを明確にすることができるはずです。

于 2012-11-21T16:59:01.567 に答える
2

このコードは、クラスのデフォルトtoString()の実装を呼び出します。つまり、次のようになります。Object

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
于 2012-11-21T16:58:55.863 に答える