不是除基本类型外 ,都是引用吗。那String 也是引用咯。
为啥我这个代码期望修改public class myClass
{
    public static void rewrite(String str)
    {
        str = "world";
    }
    public static void main(String args[])
    {
        String str = "hello";
        myClass.rewrite(str); 
        System.out.println(str); //这里输出还是"hello"
    }
}java有什么机制能让在参数传递就是String的情况下,根据引用来修改实参?
C++里这样
void foo(String str ) {} //这里是拷贝
void foo(String &str) {} //这里是引用
java怎么区分呢

解决方案 »

  1.   

    String str = "hello"; 这句为什么变量名和rewrite方法的形参名一样? 楼主何不换个名字试试? 
    rewrite方法里的str和main里的是两个变量. 执行str="world"后,这两个变量没有任何联系了. rewrite里的 str指向了一个新的字符串. 而main里的 str仍旧指向"hello".
      
      

  2.   

    String是不能被修改的。你想使用方法改变就这样:public class myClass
    {
        public static String rewrite(String str)
        {
            str = "world";
            return str;
        }
        public static void main(String args[])
        {
            String str = "hello";
            str = myClass.rewrite(str); 
            System.out.println(str); //这里输出还是"hello"
        }
    }
      

  3.   

    这个str就是一个引用
    http://bbs.csdn.net/topics/390354418
      

  4.   


    public class myClass
    {
        public static String rewrite(String str)
        {
            str = "world";
            return str;
            
        }
        public static void main(String args[])
        {
            String str = "hello";
            
            System.out.println(str); //这里输出还是"hello"
            System.out.println(myClass.rewrite(str))
        }
    }
    体会一下~  2楼
      

  5.   

    楼主可以尝试使用public class myClass{    public static String rewrite(String str)    {        str = new String("world");        return str;             }    public static void main(String args[])    {        String str = new String("hello");                 System.out.println(str); //这里输出还是"hello"        System.out.println(myClass.rewrite(str))    }}
      

  6.   


    楼主是只知其一不知其二啊。
    Java 内部确实是,除了基本类型,都是引用。
    对于引用类型,函数传递的也都是引用(实际为内存地址),不会进行 对象复制。但 Java 内,还有一种类叫 不可变 类,(其实 C# 也有,F# 就更不用说了)。
    这种类的对象,一旦建立,就不能改变, String 就是一个 不可变 类。表明上 String 是有修改的成员函数, 实际的操作是:函数新建立了一个 String 对象,并将 新对象的地址 重新赋值给引用 而已。
    老对象呢? 如果没有其他的 引用 指向他,那就等垃圾回收了。这也是为什么 String + String 的性能远比 StringBuffer 的 append 函数差的原因。
      

  7.   

     我汗…………
    这个问题跟 String 类是 immutable 没有什么关系,这样直接赋值换了可变对象也是一样的结果。这个问题就算放在C/C++里也是一样的道理。如果在C里面,变量 str 是一个指针的话,要在一个方法里改变 str 的值,那么传参至少要传“指针的指针”才行,就是说,如果 str 的类型是 char *,那你传进去的 &str 就是 char **。同样的道理这里你需要传进去的应该是“引用的引用”,不过可惜Java里面没有这种东西(这跟Reference类不一样),所以不行。
      

  8.   

    string 这个类是final的。不会变化。
      

  9.   


    同意!!! 楼主需要多熟悉下String类,你的思路是清晰的但是String类是比较特殊的,它不允许修改,你看看它的substing()/ replace()等等方法,它都是返回新的对象,而不是对原来对象做修改,不信你可以使下。
      

  10.   

     public class myClass{
    public void f1(StringBuffer str1){
    String str2="haha";
    str1.replace(0, str1.length(), str2);
    System.out.println(str1);}
    public static void main(String[] a) { 

    StringBuffer cc=new StringBuffer("hello");

    myClass o=new myClass();
    o.f1(cc);
    System.out.println(cc);
    }
    }
    楼主想要改变字符串的值不防这样试试,string类型是不可以改变的他还有另外一种就是stringbuffer这个值是可以改变的不过要注意初始化