这个问题我问了很多遍了,现在有一点思路,请大家分析一下我这个思路对不对。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。请问大家我上面这段分析对马?谢谢

解决方案 »

  1.   

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

  2.   

    在Java里就不叫句柄了, 也不说内存区域应该叫做引用和对象前者注释掉两个引用指向同一个对象, 当然输出相同后者两个引用指向两个不同的对象, 修改其中一个并不影响另一个, 所以输出不同的值注意Java中数组也是对象...
      

  3.   

    JAVA里面无论何时,传的都是值当传的是简单数据类型的时候,是它们的值的拷贝
    当传的是对象数据类型的时候,是对象的引用的拷贝,直接把拷贝指向别处,不会引响原来的引用的指向
      

  4.   

    真正我想问的问题开始了。
    现在我们把// 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的指向是不可能的.
      

  5.   

    分析错误,程序也不正确
    首先把程序中System.out.print(b[0]);改成System.out.print(b[i]);
    然后是分析,当注释行没去掉的时候,a的地址被传入,这个时候输出两个一样的字符串
    当去掉的时候,虽然a的地址被传入了,但是根据java的参数传递规则,对象的传入是引用的,对其实行修改将对起不作影响,但是可以修改其属性并在修改后保留。所以,当你b=new byte[3];的时候,b对a的控制就不起作用了,这个时候将输出不同的串
      

  6.   

    帮你修改了一下:
    public class lesson2 {
    public  static void main(String  arg[]){
    byte[] a=new byte[]{4,5,6,};    
             IP(a);
    for(int i=0;i<3;i++)
       System.out.println(a[i]);
    }
    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.println(b[i]);
    }
    }