我有一段我不太明白的代码。它造成了一个错误。
有一个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”都增加一年。此方法不应更改任何值,但应返回新的表示。
有什么想法吗?
答案 0 :(得分:5)
行Calendar rtn = currentDate;
将对象的引用分配给其他变量。从这一点rtn
和currntDate
引用相同的对象。如果你想,内存中的相同位置。因此,使用其中一个引用完成的所有更改都是使用第二个引用可见的,因为在同一对象上完成。
答案 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的任何操作都与参数中传递的对象相同。