我有:
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY,1);
c.set(Calendar.MINUTE,23);
c.set(Calendar.SECOND,22);
Calendar c2 = Calendar.getInstance();
c2 = c ; //
如果我想将 Calendar c2 设置为等于 Calendar c,这最后一条语句是否正确?
我有:
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY,1);
c.set(Calendar.MINUTE,23);
c.set(Calendar.SECOND,22);
Calendar c2 = Calendar.getInstance();
c2 = c ; //
如果我想将 Calendar c2 设置为等于 Calendar c,这最后一条语句是否正确?
尽管c2 = c
看起来可行,但这不是您想要的:两个变量都将指向同一个日历实例。作为此分配的结果,对 所做的任何更改也c
将在c2
其中,反之亦然。
您可以使用clone()
方法来制作对象的副本Calendar
,如下所示:
Calendar c= (Calendar)c2.clone();
这个说法:
c2 = c ;
会将 的值复制c
到c2
. 的值c
不是一个对象——它Calendar
是一个引用。在此语句之后,两个变量具有相同的值 - 对同一对象的两个引用。Calendar
可以通过任一变量观察对象的任何变化。
这就像给两个不同的人一张纸,上面写着你的家庭住址——如果一个人使用这个地址去你家并将前门涂成绿色,那么另一个人也会看到这一点。
请注意,这不是特定的 - 这是Java中所有Calendar
类的赋值行为。
(基本上,区分变量、引用和对象非常重要。在正常讨论中,为了简洁起见,这三者经常被错误地使用,但你需要能够在需要时区分它们。)
请注意,此代码:
Calendar c2 = Calendar.getInstance();
c2 = c;
正在毫无意义地创建一个新Calendar
实例。它会更明智地写成:
Calendar c2 = c;
该代码将具有相同的可见效果,但无需调用Calendar.getInstance()
然后丢弃新创建的对象。
c2 = c 意味着您将有 2 个字段指向同一个实例。如果你修改 c 你也会修改 c2
c2 = c.clone() 克隆实例并返回另一个实例。如果你修改 c 你不会修改 c2
日历类有一个方法compareTo
。看看那个
你甚至不需要c2 = Calendar.getInstance()
,直接分配'c2 = c'。