クラス型変数は何を参照しているか

DataTest.java

  1 class DataTest {
  2 
  3   public static void main(String[] args){
  4     //クラス型変数data
  5     Data data = new Data("rdera",170,60);
  6     System.out.println(data);
  7     data.print();
  8 
  9     System.out.println();
 10 
 11     //参照先をコピー
 12     Data data2 = data;
 13     System.out.println(data2);
 14     data2.print();
 15 
 16     System.out.println();
 17 
 18     //クラス型変数dataとdata2の
 19     //参照先が等しいのかを確認する
 20     if (data == data2) System.out.println("等しいよ");    
 21     else               System.out.println("等しくないよ");

実行結果

$ java DataTest
Data@10d448
Name=rdera
height=170
weight=60

Data@10d448
Name=rdera
height=170
weight=60

等しいよ

分かったこと

クラス型変数はアドレスのようなものを参照している。

追記

実行結果でなぜ以下の出力がなされたのか分かったので書いておく。

Data@10d448

javaではクラス型参照変数をそのままSystem.out.printlnに渡すときに、勝手にtoStringメソッドなるものを呼び出している。その場合、toStringメソッド以下の文字列は以下の文字列を返す。

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

つまり、クラス名、@、インスタンスのハッシュコードの符号無し16進数表現
だから、

System.out.println(data);

という処理でData@10d448なる出力が得られたんです。


生成されたインスタンスは、他のクラス型変数からも参照できる。

Data data2 = data;

"data == data2"ではクラス型変数の参照先が等しいかを確認している。

等しいと、"true"を返す。等しくないと"false"を返す。

if (data == data2)