日历卷会影响其他日历

时间:2011-10-05 09:47:08

标签: java

我有一段我不太明白的代码。它造成了一个错误。

有一个Calendar对象和一个将此日历对象写入字符串的方法,但首先增加年份。但是,即使有2个Calendar对象,它们也都被滚动。

请参阅执行以下滚动的方法

public static synchronized Calendar rollDatePlus1Year(Calendar currentDate){
    Calendar rtn = currentDate;
    rtn.roll(Calendar.YEAR, 1);
    rtn.roll(Calendar.MINUTE, -1);
    return rtn;
}

从这个“currentDate”和“rtn”都增加一年。此方法不应更改任何值,但应返回新的表示。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

Calendar rtn = currentDate;将对象的引用分配给其他变量。从这一点rtncurrntDate引用相同的对象。如果你想,内存中的相同位置。因此,使用其中一个引用完成的所有更改都是使用第二个引用可见的,因为在同一对象上完成。

答案 1 :(得分:2)

AlexR已经解释了为什么你的错误正在发生。要解决您的问题,您需要创建一个新的Calendar对象:

public static synchronized Calendar rollDatePlus1Year(Calendar currentDate){
    Calendar rtn = Calendar.getInstance();
    rtn.setTimeInMillis(currentDate.getTimeInMillis());
    rtn.roll(Calendar.YEAR, 1);
    rtn.roll(Calendar.MINUTE, -1);
    return rtn;
}

要记住的关键是,赋值运算符=不会在其右侧创建变量的副本,它会在左侧为引用分配右侧的引用。

答案 2 :(得分:0)

您实际所做的只是将引用复制到currentDate ,因此对rtn的任何操作都与参数中传递的对象相同。