为什么Java使用相同的值更新多个变量?

时间:2013-03-31 01:56:36

标签: java class variables methods reference

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

我在另一个名为Exercise的类中有一个构造函数方法,该类应该使用以下参数创建一个对象: 名为extype的字符串对象 int对象叫做min 时间对象叫做开始 时间对象名为end

我希望构造函数初始化start,然后使用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 =新练习(“跳舞”,90岁,第一次);

15:45

15:45

17:15 17:15

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

感谢。

5 个答案:

答案 0 :(得分:1)

这是因为Java使用了对象的引用,而不是valules

因此,当你执行start = s时,它不会将start设置为s的值,而是将start设置为与s相同的对象。等等另一个人。

然后,当你在其中任何一个上调用一个方法(即:start,end或s)时,你只能在一个对象上调用这个方法,由这三个变量引用。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

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

这应该有效。

祝你好运!

答案 3 :(得分:0)

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

Object obj;
cpy = obj;

objcopy都将指向SAME对象。如果您更新它们,则会受到影响。

答案 4 :(得分:0)

  

为什么Java使用相同的值更新多个变量?

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