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

关于对象传递的一个问题

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?   为什么?   对象作为参数传递的不是句柄马?可最后结果为什么是这样呢?请高手解答,谢谢




------解决方案--------------------
public static void add3(Integer i ){
int val =i.intValue();
val+=3;
i=new Integer(val);
}


你把 i 传给这个方法 传的是这个应用的拷贝 也就是说 引用是传值的

你在方法里面改变这个引用的指向的具体对象 外面的 i 肯定不会受影响

受影响的只是方法里面的 局部变量 i 指向了新的对象


------解决方案--------------------
public static void add3(Integer i ){
int val =i.intValue();
val+=3;
i=new Integer(val);
//这里i已经指向了一个新的对象,不再是原来的对象,但是在main中的Integer i并不会指向新的对象,所以main中的i仍然是旧的
}
------解决方案--------------------
答案是0
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() 这样的方法……
------解决方案--------------------
告诉你一个决窍:

在JAVA中,基本类型(int,char,boolean等),包括基本类型的类(Integer,character,Boolean,String等,)在函数参数传递当中传递的都是值。其他非基本类型类传递的都是引用。

不信你可以自己试一下。如此解释不知道你满不满意?


有多少分给我多少吧!  *^_^*
------解决方案--------------------
> 在JAVA中,基本类型(int,char,boolean等),包括基本类型的类
> (Integer,character,Boolean,String等,)在函数参数传递当中
> 传递的都是值。其他非基本类型类传递的都是引用。

“其他非基本类型类传递的都是引用”这种说法容易引起误解。

我不是说这个说法是错误的,只是容易引起误解。

对于“参数”,我们都知道“形参”和“实参”。Java 中,形参是一个变量,它保存着指向某个 Object 的引用;在参数传递过程中,传过去的是“形参的值”(所以有人说 Java 是“值传递”),也就是“对实际 Object 的引用”(所以有人说 Java 是“引用传递”)。

对于实参来说,它得到的是“对实际 Object 的引用”,也就是“形参的值”,但决不是“对形参的引用”。

想必大家都知道那个经典的争论吧:“Java 的方法调用是值传递还是引用传递?”其实争来争去,只是文字上的误会而已。

在 C/C++ 中,所谓“引用传递”其实是指“对形参的引用”,通过这种形式,可以做到“在函数体内通过修改实参的值,实现对形参的值的修改”。而在 Java 中,这是做不到的,只能做到修改“实际 Object 的值”而已。

扯远了,回到楼主这个问题,由于“实际的 Object”碰巧是一个 immutable object,所以,连它的值也是修改不了的。

------解决方案--------------------
我觉得这个程序包含了两个严重的语法错误:
1,基本数据类型(其中有integer)按值传递;
2,在方法中用了new操作符就说明创建了另一个对象的引用,而你改变的只是这个新引用的值,原来的不变。