日期:2014-05-20  浏览次数:20597 次

解释下这个结果
public class Test {
public static void add3(Integer i) {
int val = i.intValue();
val += 3;
i = new Integer(val);
//return i;
}

public static void main(String[] args) {
Integer i = new Integer(0);
add3(i);
System.out.println(i.intValue());
}
}
控制台打印;0
------最佳解决方案--------------------
add3里面的i跟你外面的i不是同一个。
方法里面的i是外面i的一个引用。在栈里面是2个数据
但是方法传递的时候,同时指向堆里面的对象。

当你对引用进行操作的时候,它又重新在堆里面建立了相对于的对象,那么它对外面的引用也就没用了

你在方法里面改变的i的值只是传进来引用的i,而不是外面那个i

其实如果你不把方法里面的参数设置成一样好理解一点

public class Test {
public static void add3(Integer i1) {
int val = i1.intValue();
val += 3;
i1 = new Integer(val);
//return i;
}

public static void main(String[] args) {
Integer i = new Integer(0);
add3(i);
System.out.println(i.intValue());
}
}

你那么写是在弄懂了关系的情况下,其实他们只不过名字一样,内容是不一样。
如按照我的写法,你就能避免主观认为两个i是一样的。

------其他解决方案--------------------
i = new Integer(val);

上面这句在方法里生成一个新的对象,让方法里的变量i指向了这个新的对象,与外边的i没有关系了。
------其他解决方案--------------------
引用:
Java code?1i = new Integer(val);
上面这句在方法里生成一个新的对象,让方法里的变量i指向了这个新的对象,与外边的i没有关系了。
说的很直白了