import java.io.*;
class text{
public static void main(String[] args)  {
String str="aaaa";
String t;
t="bbbb";
str=t;
System.out.println(str);   //此处输出str值为bbbb
changeStr(str);
        System.out.println(str);   //调用changeStr方法但结果str的值并不是cccc却是bbbb
}
public static void changeStr(String t){
t=new String("cccc");
}
}不是说String是用来处理不可变字符串的吗,那为什么会出现这种情况呢?为什么字符串str创建后值有时变有时不变呢??
这和理论上的“字符串一旦创建,内容就不再改变”不一样啊!
求各路高手出来指点一下~~~

解决方案 »

  1.   

    这种 问题你去baidu相信 你收获会更多
      

  2.   


    import java.io.*;
    class text{
        public static void main(String[] args)     {
            String str="aaaa";
            String t;
            t="bbbb";
            str=t;                     //此处str指向字符串t的起始内存地址,所以输出的是t的内容
            System.out.println(str);   //此处输出str值为bbbb
            changeStr(str);            //调用changeStr()方法并没有改变str引用的指向,所以输出的还是t的内容
            System.out.println(str);   //调用changeStr方法但结果str的值并不是cccc却是bbbb
        }
        public static void changeStr(String t){
            t=new String("cccc");
        }
    }
      

  3.   

    看看这个帖子吧~~
    http://topic.csdn.net/t/20051130/22/4429667.html
      

  4.   

    import java.io.*;
    class text{
        public static void main(String[] args)     {
            String str="aaaa";
            String t;    //你这里只声明了一个引用,内存没有分配具体空间
            t="bbbb";    //这里内存创建空间,并存储值
            str=t;       //str 放弃原来指向的内存地址 , 从新指向 t 指向的地址 现在str t 指向同一地址
            System.out.println(str);   
            changeStr(str);             
            System.out.println(str);   
        }//至于这个方法,由于String是final类型,每次改变的时候都从新创建一个String对象。 所以会出现你的情况。
        public static void changeStr(String t){    
            t=new String("cccc");
        }
    }
      

  5.   

    String 对象一旦创建值不可变String str = "abc";
    str = "bmn";  这个str已经不是原来的str了 , 创建了一个新的对象还叫原来的名字str . 所有才会有 StringBuffer 和 StringBuilder 这两个东西存在 ,解决每次字符串改变的效率问题。
      

  6.   

    import java.io.*;
    class text{
        public static void main(String[] args)     {
            String str="aaaa";
            String t;
            t="bbbb";
            str=t;
            System.out.println(str);           changeStr(str);
            System.out.println(t);
            System.out.println(str);       }
        public static void changeStr(String t){
            t=new String("cccc");
            System.out.println(t);
           
        }
    }你这样再试试应该就该明白了!!!
      

  7.   

    “字符串一旦创建,内容就不再改变“
    这个要从虚拟机JVM内部来说吧
    new String("AAAbbb");后,在虚拟机保留的有"AAAbbb";
    当你解惑字符串变为"AAAb" 如果之前虚拟机中没有 则重新创建
      

  8.   

     public static void changeStr(String t){
            t=new String("cccc");
        }java的参数引用是值的传递,不是存储地址的
    传递,所以你的方法实际上改变的是参数的变量。
    改为:
    将 String t改为全局变量。
    改为:
        
          
        class text{
       String t = ""; 
        public static void main(String[] args)     {
            String str="aaaa";
            String t;
            t="bbbb";
            str=t;
            System.out.println(str);   //此处输出str值为bbbb
            changeStr(str);
            System.out.println(str);   //调用changeStr方法但结果str的值并不是cccc却是bbbb
        }
        public static void changeStr(String t){
            this.t=new String("cccc");
        }} 
      

  9.   

    import java.io.*;
    class text{
        public static void main(String[] args)     {
            String str= new String("aaaa");
            String t;
            t="bbbb";
            str=t;
            System.out.println(str);   //此处输出str值为bbbb
            String s=changeStr(str);
            System.out.println(s);
            System.out.println(t);
            System.out.println(str);   //调用changeStr方法但结果str的值并不是cccc却是bbbb
        }
        public static String changeStr(String t){
            t=new String("cccc");
            System.out.println(t);
            String s = t;
            return s;
            
           
        }
    }changeStr(String t)是引用传递,在方法里生成了一个同名的t String对象 ,赋值是又重新指向了一个新的地址。
      

  10.   

    import java.io.*; 
    class text{ 
        public static void main(String[] args)    { 
            String str="aaaa"; //从内存分配一个“aaaa”的空间给str
            String t; //申明了t的一个引用
            t="bbbb"; //内存分配“bbbb”,并指向t的引用
            str=t;                    //把str的引用也指向t,str和t指向同一内存空间
            System.out.println(str);  //输出str的指向,也是t的指向 
            changeStr(str);            //调用changeStr(str)方法,传递str的引用
            System.out.println(str); //输出str的引用指向 
        } 
        public static void changeStr(String t){ 
            t=new String("cccc"); //这里从内存里面重新分配了一个空间给t,但str的指向并没有改变,所以打印的结果是“bbbb”,而不是“cccc”
        } 
    }import java.io.*; 
    class Mine{ 
        public static void main(String[] args)    { 
            String str="aaaa"; 
            String t; 
            t="bbbb"; 
            str=t;                   
            System.out.println(str);  
            str=changeStr(str);
            
            System.out.println(str);
        } 
        public static String changeStr(String t){ 
            t=new String("cccc");
            return t;
            } 
    }这样就可以了
      

  11.   


    凶器说的没错,你只改变了changeStr(String t) t的地址。影响不到外面的地址的。
    好比下列代码,也是同样的原因。import java.io.*; 
    class interfaceTest{ 
       public static void main(String[] args)    { 
         StringBuffer sb=new StringBuffer("66666");
         changeStr(sb);
         System.out.println(sb);//输出666665555
       } 
    public static void changeStr(StringBuffer s){ 
    s.append("5555");//改变传进来的地址上,对应堆的上值。 所以影响到sb
         s=new StringBuffer("33333");//改变了地址
         s.append("2122");//地址不一样影响不到外面的 sb
       } 
    }
      

  12.   

    String  很特殊 有时它当做值类型 你调用的那个方法就能体现出来 
      

  13.   

    看了大家分析的原因感觉不太合适,一句话说明问题:因为java语言的传参方式是值传递,所以改变形参不会影响实参的变化。不仅仅是String类型,所有的数据类型都是一样的结果。我想回复后,大家肯定会有新的想法提出来的,哈哈
      

  14.   

    java语言的传参方式是值传递,如果传递的是克隆对像呢?
      

  15.   

    在下面那个方法里直接输出就是你new的值了,因为你的str是局部变量
      

  16.   

    记得我之前回答过一个类似的问题,在方法内部给入参赋值。这是错误的。
    我不写那么多文字和代码,就用两句话:
    1)java没有指针,所有没有C语言“通过指针修改入参”的功能:以下是C修改入参的典型应用
    void swap(int *a,int *b)
    {
       int temp = *a;
       *a = *b;
       *b = temp;
    }2)java也没有C++引用传递的功能,所以也无法“通过引用修改入参”:以下是C++的引用修改入参功能
    void swap(int &a,int &b)
    {
       int temp =a;
       a = b;
       b = temp;
    }归根到底,java所有参数都是值传递。关于值传递和引用传递、指针传递的话题,建议各位去学习一下C以及java的高级话题:深入java内存
      

  17.   


    java 中都是值传递c才会有引用传递
      

  18.   

    java所有参数都是值传递,你的函数中返回的是void类型,即不返回任何值:
     public static void changeStr(String t){
            t=new String("cccc");
        }
    可以试着改一下:
    public static String changeStr(String t){
            t=new String("cccc");
            return t;
        }
      

  19.   

    import java.io.*;
    class text{
        public static void main(String[] args)     {
            String str="aaaa";
            String t;
            t="bbbb";
            str=t;
            System.out.println(str);   //此处输出str值为bbbb
            System.out.println(changeStr(str));   //调用changeStr方法但结果str的值并不是cccc却是bbbb
        }
        public static String changeStr(String t){
            t=new String("cccc");
            return t;
        }
    }这样你就可以得到cccc了 。你的那个函数没有返回这个字符串。所以你打印的是开始这个字符串变量
      

  20.   

    我之前也问过这个问题,还和朋友争论说:String a="aaa"; a="aaa"+"bbb"; System.out.println(a)的值是 aaabbb,我说这不是改变了吗,后来说这个a是重新指向的