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)的状态。它在哪里保存?如果没有代码可以保存它,它是如何保存的?
答案 0 :(得分:0)
您必须了解java中Reference和Objects的概念。引用是指向对象的指针。所以基本上当你说:
incrementer count1 = new incrementer();
你正在做两件事。首先,在堆中创建一个对象,然后创建一个名为count1的引用,该引用指向堆中的对象。
当你传递&#34; count1&#34;在实际传递对象的方法中。这意味着堆中的对象基本上保留在堆中,但是另一个引用&#34;增量计数器&#34;已创建,它还指向count1引用指向的对象。
那么现在使用引用&#34;计数器&#34;对所有对象进行更改的内容影响count1指向的同一个对象。
所以就像2个人用自己的琴弦在空中抓住一只风筝一样。无论是谁拉它都是在空中飞得很高的风筝。
我认为你认为对象实际上是通过&#34;然后更改然后返回并将其状态复制回原始对象。事实并非如我所解释的那样。