public class LostMessage {
public static void add3(Integer i ){
int val =i.intValue();
val+=3;
i=new Integer(val);
}
public static void main(String[] nnnn){
Integer i = new Integer(0);
add3(i);
System.out.print(i.intValue());
}
} 请问这段代码输出的是0,还是3? 为什么? 对象作为参数传递的不是句柄马?可最后结果为什么是这样呢?请高手解答,谢谢
int val =i.intValue();
val+=3;
i=new Integer(val);
}
你把 i 传给这个方法 传的是这个应用的拷贝 也就是说 引用是传值的你在方法里面改变这个引用的指向的具体对象 外面的 i 肯定不会受影响受影响的只是方法里面的 局部变量 i 指向了新的对象
int val =i.intValue();
val+=3;
i=new Integer(val);
//这里i已经指向了一个新的对象,不再是原来的对象,但是在main中的Integer i并不会指向新的对象,所以main中的i仍然是旧的
}
为0,
方法中的i=new Integer(val);,不会返回 System.out.print(i.intValue());
好象 是
-----------------------------------------------------
Java基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的
Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,而原对象的值
不是会改变的.
1。要理解JAVA是值传递,对于基本类型(int,byte...) ,String 类,引用变量传递的是副本不会因为调用方法的改变而改变
2.但是一个引用变量的属性是可以改变的例如:1.public class Test{
2.public static void main (String [] args) {
3.StringBuffer a = new StringBuffer ("A");4.StringBuffer b = new StringBuffer ("B");
5.operate (a,b);
6.System.out.println(a + "," +b);
7.}
8. static void operate (StringBuffer x, StringBuffer y) {
9. y.append(x);10.x=new StringBuffer();11. }
12. }这到题的答案是The code compiles and prints “A, BA” y 的内容发生了改变在y.append(x)中
而x还是引用变量,没有做任何的改变那么输出的结果还是A不会发生变化要记住的是引用变量不会发生改变,他中间的属性和内容才会改变,在你的程序里面因为传递的是个Integer引用变量那么它调用的是副本,它不会影响到返回实参i的值,那么当你在main函数调用i的时候还是原来为0的那个值所有最后答案是0 ,这是我的理解希望对你有帮助
i = new Integer(val);
改成
i.setValue(val);
就可以在 main() 中输出 3 了。不过很可惜,Integer 是一个 immutable object,不能改里面的值,所以不存在 setValue() 这样的方法……
所以 输出是0
> (Integer,character,Boolean,String等,)在函数参数传递当中
> 传递的都是值。其他非基本类型类传递的都是引用。“其他非基本类型类传递的都是引用”这种说法容易引起误解。我不是说这个说法是错误的,只是容易引起误解。对于“参数”,我们都知道“形参”和“实参”。Java 中,形参是一个变量,它保存着指向某个 Object 的引用;在参数传递过程中,传过去的是“形参的值”(所以有人说 Java 是“值传递”),也就是“对实际 Object 的引用”(所以有人说 Java 是“引用传递”)。对于实参来说,它得到的是“对实际 Object 的引用”,也就是“形参的值”,但决不是“对形参的引用”。想必大家都知道那个经典的争论吧:“Java 的方法调用是值传递还是引用传递?”其实争来争去,只是文字上的误会而已。在 C/C++ 中,所谓“引用传递”其实是指“对形参的引用”,通过这种形式,可以做到“在函数体内通过修改实参的值,实现对形参的值的修改”。而在 Java 中,这是做不到的,只能做到修改“实际 Object 的值”而已。扯远了,回到楼主这个问题,由于“实际的 Object”碰巧是一个 immutable object,所以,连它的值也是修改不了的。
$ z(o-.-o)(o-.-o) . $
$ ┏~﹊︸ ̄~﹊︸ ̄~┓ $
$ IT者-IT开发者的网站-- $
$ 10万篇技术资料--天天更新 $
$ -----www.itzhe.cn----- $
> (Integer,character,Boolean,String等,)在函数参数传递当中
> 传递的都是值。其他非基本类型类传递的都是引用
言简意赅!!
可以这样改:
public class LostMessage {
public static Integer add3(Integer i ){
int val=i.intValue();
val+=3;
Integer i2=new Integer(val);
return i2;
}public static void main(String[] nnnn){
Integer i = new Integer(0);
i=add3(i);
System.out.print(i.intValue());
}
} 打印出来就是3了。
1,基本数据类型(其中有integer)按值传递;
2,在方法中用了new操作符就说明创建了另一个对象的引用,而你改变的只是这个新引用的值,原来的不变。这是我专门写来验证我的话的:
public class refer {
public static void main(String arg[]){
byte[] a=new byte[3];
IP(a);for(int i=0;i<3;i++)
System.out.print(a[0]);
}public static void IP(byte[] b){// b=new byte[3];
for(int i=0;i<3;i++)
b[i]=1;
}
}“//”加上打印结果是111,去掉就是000。不信你试!
比如
int i=10;
i.method(); 没有这样的东西
但是Integer 就不同合理
Integer i= new Integer (10);
i.intValue(); 这个却是可以的。