结果当然是0,请体会下面的代码 public class Test2 { public static Integer add3 (Integer i) { int val = i.intValue(); val += 3; return new Integer (val); }
public static void main (String args [ ] ) { Integer i = new Integer (0); i=add3 (i); System.out.println (i.intValue ( ) ); } } 它打印出来的结果可能就是你想要的,仔细考虑一下:)
main中i从前到后一直都没有改变过。add3方法中的i并没有改变main中的i. 可以改成: public static Integer 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); i = add3 (i); System.out.println (i.intValue ( ) ); }
i = new Integer (val); 问题出在这句上面
这个问题知道的时候很简单的,不知道的时候很复杂的。首先我们要明白java中引用的概念。我们假设jvm的内存空间有一个对象(objectA),这个对象程序层面上是不可见的,我们使用引用这个概念来使用这个对象。我们程序提供refA,refB两个引用指向这个对象。当然我们这个时候可以通过refA,refB来处理对象objectA了。 其次也是最重要的一点,我们可以把引用指向别的对象。比如jvm中还存在一个对象objectB的话,我们也可以使用引用refB指向objectB(本来refB是指向objectA的)。最后,函数传参数的时候,基本类型是传值的,但是其他的都是传引用的。实际上传递是引用的copy(*****注意不是引用指向对象的copy******),所以我针对传入参数操作时,操作的是同一个对象。但是这里理解有一个困难的地方就是,我们只能利用对象的成员函数来操作对象,如果我们对引用重新赋值的话(就是你的例子),引用就不是指向原来那个对象了,所以就达不到你要的效果了。****************************************************** 这里的说明对于String类不适合的,因为String在java中很特殊, 自己需要了解的话,请自己研究(看jdk原代码) ****************************************************** 当你在函数add3()中的一行; i = new Integer (val); 执行以后,实际上i已经是指向内存某处的其他对象了,而不是 main函数的 Integer i = new Integer (0); 的那个i了。
是对象作用域的问题。 参数传进去的是一个引用,在函数add3里面你只是改变了函数里面Integer i对象的值,main里面的Integer i实际上没有改变。这种情况是因为i的类型是Integer,如果i是int类型就会得到你想要的效果了。试一试,下面的代码:public class Test { public static void main (String args [ ] ) { int i = 2; i = add2(i); System.out.println (i); } private static void add2(int i) { i += 2; System.out.println(i); } }可以得到你要的结果,这是因为i是int型,是基本的类型。
再给一种解决办法,对了,这可能不是解决办法,只是说明有关方法参数的问题:public class Test { public static void add3 (MyInteger i) { int val = i.getValue(); val += 3; i.setValue(val); } public static void main (String args [ ] ) { MyInteger i = new MyInteger (0); add3 (i); System.out.println (i.getValue ( ) ); } } class MyInteger { public MyInteger(int value) { this.value =value; } public void setValue(int value) { this.value =value; } public int getValue() { return value; } private int value; }
public class Test2 {
public static Integer add3 (Integer i) {
int val = i.intValue();
val += 3;
return new Integer (val);
}
public static void main (String args [ ] ) {
Integer i = new Integer (0);
i=add3 (i);
System.out.println (i.intValue ( ) );
}
}
它打印出来的结果可能就是你想要的,仔细考虑一下:)
可以改成:
public static Integer 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);
i = add3 (i);
System.out.println (i.intValue ( ) );
}
问题出在这句上面
其次也是最重要的一点,我们可以把引用指向别的对象。比如jvm中还存在一个对象objectB的话,我们也可以使用引用refB指向objectB(本来refB是指向objectA的)。最后,函数传参数的时候,基本类型是传值的,但是其他的都是传引用的。实际上传递是引用的copy(*****注意不是引用指向对象的copy******),所以我针对传入参数操作时,操作的是同一个对象。但是这里理解有一个困难的地方就是,我们只能利用对象的成员函数来操作对象,如果我们对引用重新赋值的话(就是你的例子),引用就不是指向原来那个对象了,所以就达不到你要的效果了。******************************************************
这里的说明对于String类不适合的,因为String在java中很特殊,
自己需要了解的话,请自己研究(看jdk原代码)
******************************************************
当你在函数add3()中的一行;
i = new Integer (val);
执行以后,实际上i已经是指向内存某处的其他对象了,而不是
main函数的
Integer i = new Integer (0);
的那个i了。
参数传进去的是一个引用,在函数add3里面你只是改变了函数里面Integer i对象的值,main里面的Integer i实际上没有改变。这种情况是因为i的类型是Integer,如果i是int类型就会得到你想要的效果了。试一试,下面的代码:public class Test {
public static void main (String args [ ] ) {
int i = 2;
i = add2(i);
System.out.println (i);
}
private static void add2(int i) {
i += 2;
System.out.println(i);
}
}可以得到你要的结果,这是因为i是int型,是基本的类型。
public static void add3 (MyInteger i) {
int val = i.getValue();
val += 3;
i.setValue(val);
} public static void main (String args [ ] ) {
MyInteger i = new MyInteger (0);
add3 (i);
System.out.println (i.getValue ( ) );
}
}
class MyInteger {
public MyInteger(int value) {
this.value =value;
}
public void setValue(int value) {
this.value =value;
}
public int getValue() {
return value;
}
private int value;
}