Java参数传递问题

fsm*_*fsm 2 java parameters integer

我对Java比较陌生,在尝试使用某些代码时遇到了令我惊讶的事情.希望有人能够对此有所了解.这是与我的问题相关的一些代码片段.那些阅读过编程实践的人可能会觉得这很熟悉.

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

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

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

class CounterFunction implements MapFunctionI {
public void function(Object node, Object arg){
    ((MyInteger)arg).increment();
}
}
Run Code Online (Sandbox Code Playgroud)

这是我怎么称呼这个.

    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());
}
Run Code Online (Sandbox Code Playgroud)

这是MyInteger类型.

class MyInteger {
private int n;

MyInteger(int i){
    n = i;
}

public void increment(){
    n++;
}

public int value(){
    return n;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果您想知道我为什么使用自己的Integer类型,那就是我的问题.我尝试使用Java Integer类型,但我无法使其工作,打印的答案始终为O,"整数"的值不会在多个调用中持续存在.我是这样做的,

arg = ((Integer)arg).intValue() + 1;
Run Code Online (Sandbox Code Playgroud)

什么解释了这种行为?

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

Car*_*icz 6

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

下一个问题是传递给函数的是对该Integer的引用.您可以在函数内部将该引用更改为指向不同值的Integer,但是函数内部更改的引用永远不会传递回调用函数,因此其值与此无关.

您的自制类的工作原因是您现在正在更改对象的内部内容而不仅仅是对它的引用.函数内部和外部都存在相同的对象,因此当您在内部更改它时,确实可以在外部看到更改.