String对象作为参数传递,传递的是对象的值,但作为一个引用类型,为何不象数组和自定义类那样传递的是对象内存地址?
有人说string的实质是char[] 但是还是是一个char数组阿,应传递首元素的内存地址阿?

解决方案 »

  1.   

    String是特殊的对象,与一般的是不一样的。
      

  2.   

    http://www.javaeye.com/topic/43102看看这个吧
      

  3.   


    这并没有说明问题啊。。如果是用String str="abc";//这种方式创建对象,当参数传递时直接传递 abc 能理解String str=new String("abc");//这种方式用了new关键字,那说明是在堆区中创建了,并且返回了一个引用给str这样的引用不还是一个在堆区中的地址值嘛
      

  4.   

    谁说String参数传的不是地址??同样是地址啊~~~~
      

  5.   

    传递分为:按值传递和引用传递。String对象的参数传递还是按值传递也就是说,方法中的形参值的任何改变都不会影响到实参
    public class  Test3     

    public static void f(String str)
    {
    str=str+"1"; 
    }   
    public static String f1(String str)
    {
    return str+"1"; 

    public static void main(String[] args)
          {
               String a="abc";
    String b=new String("abc");
    f(a);
    f1(a);
    System.out.println(a);  
    System.out.println(f1(a));  f(b);
    f1(b); 
    System.out.println(b);  
    System.out.println(f1(b));     
          }
    }
      

  6.   

    答:JAVA中参数传递机制只有"传值".
    若参数是基本数据类型,如:void swap(int x,int y){..}
    若调用的是:sawp(a,b);
    //此时,参数参数传递机制的"传值"中的是实参a,b变量的值.
    除此之外(即:参数不是基本数据类型),如:void change(String a){..}
    若调用的是:change("xxx");
    //此时,参数参数传递机制的"传值"中的是实参"xxx"这个对象的引用(简单理解就是内存地址).
      

  7.   

    归纳起来:JAVA中参数传递机制只有"传值". 
    若参数是基本数据类型,则:参数传递机制中的"传值"中的是实参的值
    否则(参数不是基本数据类型,即参数是对象),
    则:参数传递机制的"传值"中的实参对象引用(简单理解就是内存地址). 
      

  8.   

    String 对象作为参数传递,传递的是这个对象的引用。
    java世界中全部是对象,但只有通过引用来操作对象。
    java中也只有值传递,要么是基本类型的值,要么是对象的引用。
    这引用被认为是值,
    而这个引用也就相当于对象在内存中的地址。
      

  9.   

    那。。楼上三位的意思是String作为参数传递,传递的仍然是地址?
      

  10.   

    String比较特殊在方法中传递的时候传递的是引用的一个拷贝,就相当于复制了一个引用,这时候有两个引用,当你在方法中改变了值的时候,这个拷贝的引用指向了一个新的对象,而原引用还指向的是原来的对象。
      

  11.   

    答:是的.传递的仍然是String对象的地址.传递String对象与传递任何其它JAVA对象一样,没有任何特殊性.
      

  12.   

    楼上的不对,Stirng 是特殊的。传String 不会改变外面的原参数的值的。
      

  13.   

    答:Stirng 特殊还是不特殊,与参数传递时,是传的它的引用是没有任何关系的啊.所有的对象在参数传递时都是传的是对象的引用.这些都是一样,没有任何特殊性.
    通过传过来的对象的引用(参数的),能不能修改对象本身,是与该对象是如何定义的(即:对象本身有没有提供对其自身修改的方法有关),与参数传递本身是没有关系的.
      

  14.   

    String比较特殊 在方法中传递的时候传递的是引用的一个拷贝,就相当于复制了一个引用,这时候有两个引用,当你在方法中改变了值的时候,这个拷贝的引用指向了一个新的对象,而原引用还指向的是原来的对象。我还是支持这个答案。
      

  15.   

    答:所有的对象(包括:String对象),在方法中传递的时候传递的是引用的一个拷贝,就相当于复制了一个引用,这时候有两个引用.你的理解错在:这个拷贝的引用指向了一个新的对象,而原引用还指向的是原来的对象。实际上:这个拷贝的引用原引用都指向同一个对象即:原来的对象。
      

  16.   


    如何解释下面的结果?public class Test
    {
    static String s1 = "s1"; public static void main(String[] args)
    {
    change(s1);
    System.out.println(s1);
    }
    public static void change(String s)
    {
    s = "b";
    System.out.println(s);
    System.out.println(s1);
    s1 = "a";
    System.out.println(s1);
    }}
    结果如下
    b
    s1
    a
    a
      

  17.   

    如何解释下面的结果?
    答:这个结果很正常啊。而且我可以告诉你,void change(String s) 中的形式参数的类型String可以改成任何其它对象类型(不仅仅是String类型)均可以,如:改成Object,运行结果同样会出现你的String的那个本质上是相同的结果。
    因而你的这个例子一点也说明不了你的String的特殊性。你的例子的运行结果是如下运行的:第一步:先执行change(s1);
    过程是:
    1)将实参s1的值(注意:是串"s1"的引用)赋给形参s,(此时s1,s都指同一个串对象"s1"),
    2)然后执行:s = "b"; 此时形参s又指向串对象"b",(s不再指向串"s1"了,但实参s1仍指向串"s1"),
    3)再执行:System.out.println(s); 将输出b
    4)再执行:System.out.println(s1); 将输出 s1
    5) 再执行:s1 = "a"; 此时实参s1又指向串"a"了
    6) 再执行:System.out.println(s1); 将输出a
    第二步:执行:System.out.println(s1); 将输出a
    这就是结果。一点也说明不了什么。即:把void change(String s) 中的形式参数的类型String可以改成任何其它对象类型(不仅仅是String类型)均可以,你的这个例子一点也说明不了你的String的特殊性
      

  18.   

    多谢指教,我将s="b";
    这句理解错了 当成int i = 7;
    i = 8;
    这种赋值了,两者是有区别的。其实就是值类型和引用类型的区别。
    没有理解好。