作为参数传进去的i只是一个引用,执行完i=new Integer(val);之后,方法add3里面的i变成了另一个引用,而main方法里面的i仍是原来的引用,所以值不变
解决方案 »
- 对象变量的输出问题
- 关于在ArrayList类型中获得指定行指定列的值?
- 循环来创建JButton对象
- 如何检测1(2&3)是不合法的,而 1|(2&3) 是合法的。
- classpath里能不能用通配符 * ?
- java.io.FileNotFoundException的问题
- 谁能给我很细致的解释一下下面的冒泡算法。。。新手救助!
- Jbuilder为什么总出现"unknown license file format."
- 请斑竹把oicq号码留下好吗,要不,联系我也行,我的是4060459。谢谢。
- 有参方法入门---基础知识了解
- 怎样格式化输出:即把7输出为007?
- 请问SCJP考试培训,哪儿比较好.
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;
}