gpt4 book ai didi

Java参数传递问题

转载 作者:行者123 更新时间:2023-12-04 20:45:09 24 4
gpt4 key购买 nike

我是 Java 的新手,在尝试一些代码时遇到了让我感到惊讶的事情。希望有人可以阐明这一点。这是一些与我的问题相关的代码片段。阅读过编程实践的人可能会觉得这很熟悉。

此函数是为 List 数据类型定义的,并将传递的“fn”参数(它只是一个包装在对象中的函数)应用于列表的所有成员。

    public void apply(MapFunctionI fn, Object fnArg) {
Node curr = head;
for (; curr != null; curr = curr.getNext()){
fn.function(curr.getItem(), fnArg);
}
}

接下来,我尝试使用这个函数来计算列表中元素的数量,使用一个实现了 MapFunctionI 的类(一个需要名为“function”的方法的接口(interface))

class CounterFunction implements MapFunctionI {
public void function(Object node, Object arg){
((MyInteger)arg).increment();
}
}

我是这样调用它的。

    static void TestApply(LinkedList l){
System.out.println("Number of elements in List -> ");
MyInteger n = new MyInteger(0);
l.apply(new CounterFunction(),n);
System.out.println(n.value());
}

这是 MyInteger 类型。

class MyInteger {
private int n;

MyInteger(int i){
n = i;
}

public void increment(){
n++;
}

public int value(){
return n;
}

现在,如果您想知道为什么我使用自己的整数类型,这就是我的问题所涉及的。我尝试为此使用 Java Integer 类型,但我无法让它工作,打印的答案始终是 O,“Integer”的值在多次调用中没有持续存在。这是我的做法,

arg = ((Integer)arg).intValue() + 1;

如何解释这种行为?

而且我确信有一种更简洁的方式来提出这个问题 :-)

最佳答案

第一个问题是 Integer 类型是不可变的;一旦使用某个整数值创建,该值就无法更改。所以您不能直接更改 Integer(我并不是说您不知道或没有尝试过)。

下一个问题是传递给函数的是对该整数的引用。您可以在函数内部更改该引用以指向不同值的整数,但从函数内部更改的引用永远不会传递回调用函数,因此它的值在那里不相关。

您的自制类之所以有效,是因为您现在正在更改对象的内部内容,而不仅仅是对它的引用。函数内外存在完全相同的对象,因此当您在函数内部更改它时,更改确实会在外部看到。

关于Java参数传递问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2039190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com