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

关于句柄传递的问题。
这个问题我问了很多遍了,现在有一点思路,请大家分析一下我这个思路对不对。

public   class   refer   {
public     static   void   main(String     arg[]){
byte[]   a=new   byte[]{4,5,6,};        
                  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;
                                    for(int   i=0;i <3;i++)
    System.out.print(b[0]);
}
}

在这段代码里面,用new在内存里开辟了一个空间,里面存放着4,5,6,这时a对象(其实是句柄)指向了这个内存空间,当句柄a被传递进一个方法IP时,也就复制了这个句柄,名字叫b,现在实际有两个句柄指向同一个内存区域,然后同过对b句柄就可以修改内存里的数据了。最后输出的是两个不同的字符串,一个是000,一个是456。
上面这段说法有错吗?我认为重点是2个指向同一个内存区域的句柄。如果没有问题往下看.
-------------------------------------
真正我想问的问题开始了。
现在我们把//   b=new   byte[3];前面的注释去掉。
                                    b=new   byte[3];
for(int   i=0;i <3;i++)
b[i]=1;
程序变成这个样子了。当句柄a被传递进一个方法IP时,复制了这个句柄,名字叫b,这时b还是和a一样指向同一个内存区域的,但是程序执行到b=new   byte[3];这段时,首先在内存里又开辟了一个内存区域(到底是哪里不知道),句柄b就发生变化了,他指向这个新开辟的内存区域了,不和a指向同一个地方了,以后的操作都是对这个不知道的内存区域进行操作了,所以后面的操作不会改变句柄a指向内容了,所以最后输出的是两个相同的字符串456。

请问大家我上面这段分析对马?谢谢

------解决方案--------------------
精辟的算法
帮楼主顶


------解决方案--------------------
// b=new byte[3];前面的注释不去掉的话,
表明 a,b都指向了同一个内存地址,输出的是两个相同的字符串.

// b=new byte[3];前面的注释去掉的话,
表明 a,b分别指向了不同的内存地址,输出的是两个不同的字符串.


------解决方案--------------------
在Java里就不叫句柄了, 也不说内存区域

应该叫做引用和对象

前者注释掉两个引用指向同一个对象, 当然输出相同

后者两个引用指向两个不同的对象, 修改其中一个并不影响另一个, 所以输出不同的值

注意Java中数组也是对象...
------解决方案--------------------
JAVA里面无论何时,传的都是值

当传的是简单数据类型的时候,是它们的值的拷贝
当传的是对象数据类型的时候,是对象的引用的拷贝,直接把拷贝指向别处,不会引响原来的引用的指向
------解决方案--------------------
真正我想问的问题开始了。
现在我们把// b=new byte[3];前面的注释去掉。
b=new byte[3];
for(int i=0;i <3;i++)
b[i]=1;
程序变成这个样子了。当句柄a被传递进一个方法IP时,复制了这个句柄,名字叫b,这时b还是和a一样指向同一个内存区域的,但是程序执行到b=new byte[3];这段时,首先在内存里又开辟了一个内存区域(到底是哪里不知道),句柄b就发生变化了,他指向这个新开辟的内存区域了,不和a指向同一个地方了,以后的操作都是对这个不知道的内存区域进行操作了,所以后面的操作不会改变句柄a指向内容了,所以最后输出的是两个相同的字符串456。

请问大家我上面这段分析对马?谢谢
----------------------------------------------
分析的是对的,楼主记住一点,在JAVA里永远都是传值,也就是说想通过传递来改变a的指向是不可能的.

------解决方案--------------------
up
------解决方案--------------------
大家运行了楼住的代码了吗?怎么结果和楼主说的不一样的啊 这是怎么回事儿?
------解决方案--------------------
分析错误,程序也不正确
首先把程序中System.out.print(b[0]);改成System.out.print(b[i]);
然后是分析,当注释行没去掉的时候,a的地址被传入,这个时候输出两个一样的字符串
当去掉的时候,虽然a的地址被传入了,但是根据java的参数传递规则,对象的传入是引用的,对其实行修改将对起不作影响,但是可以修改其属性并在修改后保留。所以,当你b=new byte[3];的时候,b对a的控制就不起作用了,这个时候将输出不同的串
------解决方案--------------------
帮你修改了一下:
public class lesson2 {
public static void main(String arg[]){