关于句柄传递的问题。
这个问题我问了很多遍了,现在有一点思路,请大家分析一下我这个思路对不对。
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[]){