Java参数传递问题

标签 java integer parameters

我是 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/

相关文章:

java.lang.IndexOutOfBoundsException : Index: 0, 大小:0 异常

iphone - 递增属性 int (self.int++)

java - 从 int 获取 01 而不是 for 循环中的 1

java - 为什么字节总和是整数?

java - Jenkins作业找不到JDK但Jenkins中配置了JDK

java - 从jar中读取xml文件

java - 在Kotlin中乘以小数

c++ - 如何对具有两个变量的 vector 进行排序?

python - 根据另一个参数的值设置一个参数的默认值

c# - 在 LINQ 数据源/ GridView 中使用文本框值作为参数 : A value of type 'String' cannot be converted to type 'Double'