【问题标题】:EDIT) Using objects as parameters in a method call编辑)在方法调用中使用对象作为参数
【发布时间】:2018-01-12 00:39:35
【问题描述】:
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 类的运行如下所示:

创建 count1 = 计数器值为 1 的增量器对象

使用参数count1调用countFiveTimes方法

counter = 计数器值为 1 的增量器对象 //为对象分配新名称以在countFiveTimes方法中使用它//

用对象调用nextvalue方法(此时为计数器,之前为count1)并打印5次返回值。

(第一次运行)

温度 = 1;

计数器 = 2;

返回温度

println(温度);

打印 1

(第二次运行)

温度 = 2;

计数器 = 3;

回温

println(温度)

打印 2

....等等等等。

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

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

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

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

它在 useCounter 类中吗?如果是,在哪里?

非常感谢您的帮助,对于我可能在我的问题中造成的任何混淆,我们深表歉意。

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

预期的运行结果

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

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

【问题讨论】:

  • 以上代码应返回1 2 3 4 5。你得到了什么?
  • 这么多的输入,我还是不明白你的问题。 A) 请花时间格式化/缩进所有您的输入(尤其是您的代码)正确。 B) 阅读minimal reproducible example。不要进行冗长的解释。说明会发生什么以及您期望发生什么,最好使用简单的例子,而不是文字描述。
  • 当你创建一个“int”对象时,你将它保存在你的 RAM 中,所以,“incrementer”是另一个对象,如“int”、“string”等......它似乎停留在你的公羊,直到你释放它......如果你是那个意思。

标签: java object parameters parameter-passing


【解决方案1】:

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

 incrementer count1 = new incrementer();

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

当您在方法中传递“count1”时,您实际上传递了对象。这意味着基本上堆中的对象保留在堆中,但创建了另一个引用“增量计数器”,它也指向由 count1 引用指向的对象。

那么现在您使用引用“计数器”对对象所做的所有更改都会影响 count1 指向的同一对象。

所以这就像两个人用自己的绳子在空中抓住一个风筝。谁拉的就是高高在上的风筝。

我假设您认为对象实际上是“通过”然后更改然后返回并将它们的状态复制回原始对象。正如我所解释的那样,情况并非如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多