6

我有:

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,这最后一条语句是否正确?

4

5 回答 5

13

尽管c2 = c看起来可行,但这不是您想要的:两个变量都将指向同一个日历实例。作为此分配的结果,对 所做的任何更改也c将在c2其中,反之亦然。

您可以使用clone()方法来制作对象的副本Calendar,如下所示:

Calendar c= (Calendar)c2.clone();
于 2013-04-25T12:26:09.867 回答
3

这个说法:

c2 = c ; 

会将 的值复制cc2. 的值c不是一个对象——Calendar是一个引用。在此语句之后,两个变量具有相同的值 - 对同一对象的两个引用。Calendar可以通过任一变量观察对象的任何变化。

这就像给两个不同的人一张纸,上面写着你的家庭住址——如果一个人使用这个地址去你家并将前门涂成绿色,那么另一个人也会看到这一点。

请注意,这不是特定的 - 这是Java中所有Calendar类的赋值行为。

(基本上,区分变量、引用和对象非常重要。在正常讨论中,为了简洁起见,这三者经常被错误地使用,但你需要能够在需要时区分它们。)

请注意,此代码:

Calendar c2 = Calendar.getInstance();
c2 = c;

正在毫无意义地创建一个新Calendar实例。它会更明智地写成:

Calendar c2 = c;

该代码将具有相同的可见效果,但无需调用Calendar.getInstance()然后丢弃新创建的对象。

于 2013-04-25T12:29:07.410 回答
2

c2 = c 意味着您将有 2 个字段指向同一个实例。如果你修改 c 你也会修改 c2

c2 = c.clone() 克隆实例并返回另一个实例。如果你修改 c 你不会修改 c2

于 2013-04-25T12:27:46.187 回答
0

日历类有一个方法compareTo。看看那个

相比于()

于 2013-04-25T12:25:28.437 回答
-1

你甚至不需要c2 = Calendar.getInstance(),直接分配'c2 = c'。

于 2013-04-25T12:26:21.407 回答