编辑)在方法调用中使用对象作为参数

时间:2017-08-04 07:25:22

标签: java object parameters parameter-passing

public class incrementer {

public incrementer () {

    counter =1;
}

public incrementer (int startValue) {
    counter = startValue;
}

public int nextValue() {
    int temp = counter;
    counter++;
    return (temp);

}


private int counter;
}


import acm.program.*;

public class useCounter extends ConsoleProgram {
public void run() {
    incrementer count1 = new incrementer();
    incrementer count2 = new incrementer(1000);

    println("Five values for count1 :");
    countFiveTimes(count1);

    println("Five values for count2 :");
    countFiveTimes(count2);

    println("Another five values for count1 :");
    countFiveTimes(count1);



}

private void countFiveTimes(incrementer counter) {
    for (int i=0; i<5; i++) {
        println(counter.nextValue());

    }

}

}

我刚刚学习了在方法调用中将对象作为参数传递的概念。根据我的理解,useCounter类的运行如下所示:

使用计数器值1

创建count1 = incrementmenter对象

使用参数count1

调用countFiveTimes方法

counter =计数器值为1的递增对象 //为countFiveTimes方法//

中的对象分配新名称

用对象调用nextvalue方法(此时为counter,先前为count1)并将返回值打印5次。

(首次运行)

temp = 1;

counter = 2;

return temp

的println(温度);

打印1

(第二次运行)

temp = 2;

counter = 3;

returnm temp

的println(温度)

打印2

....依旧等等。

我将跳过count2部分,因为它与我的问题无关。

当跑步到达时     println(&#34; count1的另外5个值:&#34;); 部分,我通常希望这部分类的运行与第一部分完全相同;也就是说,我希望结果如此 1 2 3 4 五 因为我没有看到为counter1对象分配新值的代码。(我希望它与我创建它时的状态相同)

我的讲师给出的解释是,当你在方法调用中传递一个对象作为参数时,你实际上是传递对象本身,而不是对象的副本。

我觉得这个概念没问题,但问题是:保存对象的新状态在哪里?

是否在useCounter类中?如果是的话,在哪里?

非常感谢帮助,对于我在问题中可能造成的任何混淆感到抱歉。

编辑: 运行结果 count1的五个值: 1 2 3 4 五 count2的五个值: 1000 1001 1002 1003 1004 count1的另外五个值: 6 7 8 9 10

运行的预期结果

count1的五个值: 1 2 3 4 五 count2的五个值: 1000 1001 1002 1003 1004 count1的另外五个值: 1 2 3 4 5

问题:我假设在前五个值之后保存了对象(count1)的状态。它在哪里保存?如果没有代码可以保存它,它是如何保存的?

1 个答案:

答案 0 :(得分:0)

您必须了解java中Reference和Objects的概念。引用是指向对象的指针。所以基本上当你说:

 incrementer count1 = new incrementer();

你正在做两件事。首先,在堆中创建一个对象,然后创建一个名为count1的引用,该引用指向堆中的对象。

当你传递&#34; count1&#34;在实际传递对象的方法中。这意味着堆中的对象基本上保留在堆中,但是另一个引用&#34;增量计数器&#34;已创建,它还指向count1引用指向的对象。

那么现在使用引用&#34;计数器&#34;对所有对象进行更改的内容影响count1指向的同一个对象。

所以就像2个人用自己的琴弦在空中抓住一只风筝一样。无论是谁拉它都是在空中飞得很高的风筝。

我认为你认为对象实际上是通过&#34;然后更改然后返回并将其状态复制回原始对象。事实并非如我所解释的那样。