• 締切済み

Calendarクラスのフィールドは、クラス変数?インスタンス変数?どちらですか?

宜しくお願いします。 Calendarクラスのフィールドの、Calendar.YEARなどは、 Calendarというクラス名で修飾されているので「クラス変数」ですよね。 クラス変数なので、全てのインスタンスで共有されているはずです。 なので、あるインスタンスから、Calendar.YEARに変更を加えると、全てのインスタンスに 変更が適用されると思うのですが、そうなりません。何故でしょうか。 例えば以下のようなコードを書いた場合、このように出力されます。 2008年10月6日 2009年10月6日 2008年10月6日 YEARはクラス変数なので、3つ目の出力も2009年になると思ったのですが、YEARは 各インスタンスで所有されているようです。 (上手くインデントできないようでして、読みにくいコードで失礼します) import java.util.*; public class DateTest { public static void main(String[]args){ Calendar cal = Calendar.getInstance(); showDate(cal); Calendar cal2 = Calendar.getInstance(); cal2.add(Calendar.YEAR, 1);//ここでCalendarのクラス変数を変更している showDate(cal2);//変更が適用されている showDate(cal);//変更が適用されていない?なぜ? }  //Calendarインスタンスの年・月・日を出力する public static void showDate(Calendar cal){ System.out.println(cal.get(Calendar.YEAR)+"年"              +(cal.get(Calendar.MONTH)+1)+"月" +cal.get(Calendar.DATE)+"日"); } } プログラムは嘘をつかないので、自分の理解が誤っていると思います。 どなたか解決する知識をお持ちの方、どうぞご教示ください。 (初心者ですので、できれば、ほどほどのレベルの説明でお願いします。) 宜しくお願いします。

みんなの回答

noname#94983
noname#94983
回答No.1

>あるインスタンスから、Calendar.YEARに変更を加えると Calendar.YEARは、static finalな変数だから、変更はできない。 ちょっとどういうことをいっているのかわかりづいらいんだが……。 >cal2.add(Calendar.YEAR, 1);//ここでCalendarのクラス変数を変更している これは、Calendarのクラス変数を変更しているわけではない。ただ単に、Calendarインスタンスのメソッドを呼び出して、インスタンス内部に保持されている値を変更しているだけだ。クラス変数は関係ない。第1引数のCalendar.YEARは「addする値の単位」を示しているにすぎない。すなわち、「Calendar.YEARの単位で1つ分の値を、cal2インスタンスに加える」ということであって、変更しているのはあくまでインスタンスだ。 ということで、わかるだろうかね?

osiete888
質問者

お礼

回答有難うございます。 自分の誤解のようでした。 ご指摘のとおりAPIを確認しましたところ、static finalで定数でした。 Calendar.YEARという変数に直接値を代入しているものと誤解していました。 回答有難うございました。

関連するQ&A

専門家に質問してみよう