1

我有一个名为 Time 的类,其中包含其实例具有“小时”和“分钟”参数的对象。在该类中有一个名为 addMinutes 的方法,它接受一个整数并将该分钟数添加到对象的“小时”和“分钟”参数中。

我在另一个名为 Exercise 的类中有一个构造函数方法,它应该使用以下参数创建一个对象: String 对象称为 extype int 对象称为 min 时间对象称为 start 时间对象称为 end

我希望构造函数初始化开始,然后使用 Time 中的 addMinutes 方法添加该分钟数并调用该结束。但是当我使用它时,即使它们是单独的变量,开始也会随着结束而更新。

这是 addMinutes 方法

public void addMinutes(int mins) {
   this.mins += mins;
        if (this.mins >= 60) {
            addHours(this.mins / 60);
            this.mins = this.mins % 60;
      }

这是尝试使用它和输出的示例

    public Exercise(String e, int m, Time s) {
       extype = e;
       min = m;
       start = s;
       System.out.println(start);
       end = s;
       System.out.println(start);
       end.addMinutes(min);
       System.out.print(s);
       start = s;
       System.out.println(start);

使用 e = "Dancing"、m = 90 和 S = 15:45 运行此命令的输出

练习 e1 = new Exercise("Dancing",90,firsttime);

15:45

15:45

17:15 17:15

因此,当我使用 end.addMinutes(min) 时,所有变量 start、end 甚至 s 都会更新为我想要的结束时间。对此有何见解?

谢谢。

4

5 回答 5

1

这是因为 Java 对其对象使用引用,而不是值

因此,当您这样做时start = s,它不会将 start 设置为 s 的值,而是将 start 设置为与 s相同的对象。以此类推其他任务。

然后,当您在其中任何一个(即:start、end 或 s)上调用方法时,您将在一个且只有一个对象上调用此方法,该对象由这三个变量引用。

于 2013-03-31T02:02:29.380 回答
0

执行时end = s;,您将引用的对象设置为与引用的对象end相同的对象s。因此,当您更改对象时,它会反映在两个引用中。如果您希望它们不同,则必须将它们设置为不同的变量。

给你的类一个“克隆”方法,该方法创建一个相同类型的新对象,并将新对象的所有内部变量设置为旧对象的内部变量。然后克隆而不是使用'=',您将拥有单独的对象。

于 2013-03-31T02:01:46.097 回答
0

这是因为 Java 中的所有对象都是隐式引用的。如果你说 end 等于 start,那么它们都引用同一个对象,因此更新一个会导致更新另一个。

您可以执行以下操作:让 addMinutes() 返回具有指定分钟和小时的新 Time 对象。然后不要说end=start,但这样做:

Time end;
end = start.addMinutes(m);

这应该有效。

祝你好运!

于 2013-03-31T02:02:46.680 回答
0

在 java 中,存储对象的变量实际上是存储对对象的“引用”。换句话说,如果您有以下情况:

Object obj;
cpy = obj;

两者都objcopy指向同一个对象。如果您更新其中任何一个,两者都会受到影响。

于 2013-03-31T02:03:11.323 回答
0

为什么 Java 更新多个具有相同值的变量?

它不是。它正在更新单个对象,并且您有多个变量都引用该对象,因此无论您使用哪个变量来获取对象内部的值,您总是会得到相同的值。

于 2013-03-31T02:55:56.443 回答