当我更改GregorianCalendar的一个实例时,另一个实例也会更改

时间:2016-08-19 03:49:48

标签: java time gregorian-calendar

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);

输出应该是时间"现在"然后是4小时后的时间。

打印出来时,timeForm和limitForm都会显示4小时后的时间。那是为什么?

2 个答案:

答案 0 :(得分:1)

您将第二个日历设置为等于第一个日历,而不是创建第二个日历。因此,当您更改实例时,它会影响两个变量。如果您使limit = new GregorianCalendar();输出将显示2个不同的值

答案 1 :(得分:1)

您想退后一步,了解Java如何处理“引用类型”。

换句话说:Java中任何类型的对象(如GregorianCalendar对象)都通过引用识别。

当你做出像

这样的作业时
limit = time;

然后你创建另一个对象。你只需要两个变量,时间和限制,它们都“指向”同一个对象。

因此,当您使用一个变量并对引用对象进行状态更改时;当然,另一个变量也“看到”了这些变化。