2016-08-19 7 views
-1
final DateFormat dateFormat = DateFormat.getDateTimeInstance() ; 
    GregorianCalendar time = new GregorianCalendar(); 
    GregorianCalendar limit = time; 
    limit.add(GregorianCalendar.HOUR_OF_DAY, 4); 

    String timeForm = dateFormat.format(time.getTime()); 
    String limitForm = dateFormat.format(limit.getTime()); 
    System.out.println(timeForm); 
    System.out.println(limitForm); 

出力は、「now」の後に4時間後の時間を設定します。GregorianCalendarのインスタンスを1つ変更すると、もう1つのインスタンスも同様に変更されます。

出力すると、timeFormとlimitFormの両方に4時間後の時刻が表示されます。何故ですか?

+0

そこには1つのインスタンスしかありません。変数はインスタンスではなく、1つのインスタンスへの参照です。 'GeorgianCalendar limit = time;'は 'GeorgianCalendar'の新しいインスタンスを作成しません。単に' time'が参照しているのと同じオブジェクトを参照するよう 'limit'に指示します。 –

答えて

1

2番目のインスタンスを作成する代わりに、2番目のカレンダーを1番目のカレンダーと同じに設定します。したがって、インスタンスを変更すると、両方の変数に影響します。 limit = new GregorianCalendar();を作成すると、出力に2つの異なる値が表示されます

1

Javaが「参照型」をどのように処理しているかを読んでください。

つまり、GregorianCalendarオブジェクトのような何らかのオブジェクトであるJavaのものはの参照で識別されます。

そして、あなたは

limit = time; 

のような割り当てを行うとき、あなたはは、別のオブジェクトを作成されていません。 2つの変数timeとlimitを指定するだけで、両方とも同じオブジェクトを「指す」ことができます。

したがって、1つの変数を使用して、参照オブジェクトでステータス変更を変更すると、もちろん、他の変数もそれらの変更を "見て"います。

関連する問題