0
private static String getArgValue(String[] argsString, int[] jIndex, String classTag) {

    String thisToken;

    for( ; jIndex[0]<argsString.length ; jIndex[0]++) {
        System.out.println("jIndex[0]: " + jIndex[0]);

        if (condition) {
            // yadda yadda yadda
            jIndex[0]++;
            System.out.println("jIndex[0]: " + jIndex[0]);
            return retString;
        }
    }

    return retString;
}

我试过用数组和数组包装它,但都没有对原始变量Integer进行更改。i它是如何被调用的:

int[] j = new int[1];

for(int i=2; i< argsString.length; i++) {
    // yadda yadda yadda
    System.out.println("opening i: " + i);
    j[0] = i;

    thisArgValueString = getArgValue(argsString, j, thisArgClassString);
    System.out.println("closing i: " + i);
}

示例输出:

opening i: 2
jIndex[0]: 2
jIndex[0]: 3
jIndex[0]: 5
closing i: 2
4

5 回答 5

2

尝试打印您的 int holder 而不是 i 本身:

System.out.println("closing i: " + j[0]);

或者您可以简单地重新分配 i:

i = j[0];
System.out.println("closing i: " + i);

您的原始变量i不会自行更改,因为它是原始类型。整数也没有用,因为它是不可变的。所以你提供的代码本质上是正确的方法。您只需要了解,j[0] = i仅分配ito的值,j[0]而不链接j[0]to的内容i。因此,您可以从那时开始使用j[0](如本文中的第一个代码)或重新分配ij[0]如本文中的第二个代码)。

于 2012-06-04T10:51:22.687 回答
1

AnInteger是不可变的,但您显然试图将它当作可变的一样使用。那是行不通的。

另一方面, anint[1]可以用作可变 int 持有者......

...并且它在您的示例中似乎不起作用的原因是在最后一个打印语句中您正在打印i而不是您在通话j中更新的持有人。getArgValue将最后一条语句更改为:

    System.out.println("closing i: " + j[0]);

请记住,这是模拟的引用调用,而不是真正的引用调用。您必须以正确的顺序跳过箍,才能使模拟工作。

于 2012-06-04T10:49:25.603 回答
1

Java 是按值传递的,您所期望的行为,即 i 的内容被更改,与对象一致,您传递的值是对象引用。但是,对于 chars、ints 和 doubles 等原语,您传递的是实际数据本身。您放入 j[0] 的不是变量 i,而是 i 的内容。因此,现在有两个内存位置具有相同的内容——j[0] 和 i。但是,当您更改 j[0] 时,i 不受影响,因为它完全不相关——您只需将 j[0] 的内容复制到 i 中。当您将一个对象传递给一个方法时,您实际上是在传递对象引用,因此您指的是同一个对象。通过将 i 转换为 Integer,您正在自动装箱,也就是说,您正在制作 i 的副本,

于 2012-06-04T10:51:59.440 回答
1

您的代码片段表明您对数组可变性和通过引用传递的方式存在误解。

让我给你一个更简化的例子,它消除了围绕问题核心的所有非必要的废话。

public static void main(String[] args) {
   int numberToModify = 42;
   int [] arr = new int[1];
   arr = numberToModify;
   System.println("numberToModify="+numberToModify );
   System.println("arr[0]="+arr[0]);
   doStuff(arr);
   System.println("numberToModify="+numberToModify );
   System.println("arr[0]"+arr[0]);
}

private static void doStuff(int[] array){
   array[0] = 100;  
}

你应该看到打印出来的是

numberToModify=42
arr[0]=42
numberToModify=42
arr[0]=100

在您的代码示例中,您似乎期望在方法内部修改数组时变量i(这里是)也应该发生变化。numberToModify它没有,因为数组包含一个实际的值类型(因为ints 是原始的,而原始是按值传递的)。

于 2012-06-04T10:57:20.147 回答
0

所以你希望变量 i 保留对它所做的所有更改?您是否尝试将其声明为 Integer 对象?int 是一个原始类型,所以你不能通过引用传递它,将它包装在任何东西中只会分配它的值。尝试做这样的事情:

for(Integer i=2; i< argsString.length; i++) {
// yadda yadda yadda
System.out.println("opening i: " + i);
j[0] = i;

thisArgValueString = getArgValue(argsString, j, thisArgClassString);
System.out.println("closing i: " + i);

}

看看是否能解决你的问题。

希望有帮助。

于 2012-06-04T10:53:15.330 回答