//public class TT {
// static void changeStr(String str){
// str = "welcome";
// }
// public static void main(String[] args){
// String str = "1234";
// changeStr(str);
// System.out.println(str);
// }
//}
结果为何是1234
这里是引用传递,str的值应该改变了呀!!!!
求解

解决方案 »

  1.   

    String 的值不能被改变!!
      

  2.   

    String 是引用传递吧!!!!
      

  3.   

    Java参数传递没有传引用这么一说!!!!记住!!!!
    没有传引用!!!
      

  4.   


    String类型的值是不能改变的,StringBuilder和StringBuffer的值才是可以改变的,你看看String到底是怎么定义的吧?他是final类型的。我查了下JAVA API:public final class Stringextends Objectimplements Serializable, Comparable<String>, CharSequenceString 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。 字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如: 
         String str = "abc";
     等效于: 
         char data[] = {'a', 'b', 'c'};
         String str = new String(data);你自已好好体会下final啦,它是不能被改变的~~
      

  5.   

    string是引用类型但是是值传递 因为他是finally的
      

  6.   

    这和“值传递引用传递”没有关系,和“String是final的”也没有关系
      

  7.   

    方法参数是只有“值传递”的。
    这里,是将str的地址拷贝了一份传给方法的局部变量,所以还是值传递。调用方法后,原来的str和方法内的局部变量str都指向了“1234”这块地址。
    执行str = "welcome";后,局部变量str改指向"welcome"这块地址。但是原来的str还是没有变,还是指向“1234”这块地址。 
      

  8.   

    java全部是值传递,不同的是基本数据类型的值直接是值,对象的的值则是reference,类似地址,调用方法后便有两个引用,同时堆里有两个相应的对象
      

  9.   

      1。肯定不会改变。
       2。你也知道传过去的是引用,但是你想一下你传过去的引用传给谁了?
         你传过去的引用传给了 changeStr(String str)这个方法中 str。也就是说将mian方法中的
        str="1234"这个str的地址作为方法中str的值传过去了。  看下面:
      
         str="1234";
         changeStr(str);
         str="mian方法中的str的地址";而 changeStr()方法中的str的地址是不会改变的。
          所以:mian方法中的str还是等于------1234
      

  10.   

    顶啊,还有退N * N 步讲,String是不会变的,传的的Copy,就算是引用也是Copy的引用~~~
    擦,我说的话好纠结~~~
      

  11.   


    public class TT {
    static void changeStr(String str){  //在该方法里声明了一个str, str="1234"
     str = "welcome";  //该方法的str="welcome"
    }
    public static void main(String[] args){
     String str = "1234";
     changeStr(str); //将 str="1234"传递
     System.out.println(str); //main 里的str没有变化,还是1234
    }
    }
    如果想要的结果,应该这么写public class TT {
    static String changeStr(String str){  //在该方法里声明了一个str, str="1234"
     str = "welcome";  //该方法的str="welcome"
             return str; //返回str="welcome"
    }
    public static void main(String[] args){
     String str = "1234";
     str = changeStr(str); //将 str="1234"传递,并将changeStr方法的返回值赋给str
     System.out.println(str); 
    }
    }
      

  12.   

    这里是两个变量,改变一个变量的引用对象不会改变这个对象本身.
    Integer xxx = new Integer(10);xxx本来引用对象new Integer(10);再执行xxx= new Integer(1000);
    这样xxx引用了新的对象,并没有改变原来的那个对象new Integer(10);题目中的也是一样

    static void changeStr(String str){
         str = "welcome";
     }在方法调用的时候,将对象传给了str,然后str="welcome";实际这个str是引用了新的对象.与外边的方法的变量,对象无关.给一个区别的例子static void test(StringBuffer buff){
       buff= new StringBuffer("");
       buff.append("new string");
     }这个与题目相同,再看下边的static void test(StringBuffer buff){
       buff.append("new  string");
     }上边一个是不会改变(append)方法传进来的对象,而后边将会在传进来的对象后边加上字符中,达到了修改外边方法的对象的目的.
      

  13.   

    //public class TT {
    // static void changeStr(String str){
    //  str = "welcome";
    // }
    // public static void main(String[] args){
    //  String str = "1234";
    //  System.out.println(changeStr(str));
    //  System.out.println(str);
    // }
    //}
    这样试试?
      

  14.   

    public class TT {
    static String changeStr(String str){
     str = "welcome";
     return str;
    }
    public static void main(String[] args){
     String str = "1234";
     System.out.println(changeStr(str)+"");
     System.out.println(str);
    }
    }
      

  15.   

    楼上其实说得不完整,这里的确是传引用。但是你去看看String的定义,String是final的,不能改变的其值的。你在这里做等于的时候,其实是把传进来的String引用的拷贝指向了另外一个新的String。其实就相当于C语言里传指针,你直接在函数内把指针的地址修改了一样。不信你可以自己定义一个final的类试试
      

  16.   

    不是什么string不能改变,也不是什么传值传引用之类的(当然,传的是引用),而是:
    str的作用域的问题
    在changeStr方法里,有一个变量str,这个str不是main方法里的str。
    changeStr(str);语句只是给changeStr(str)方法的str传了个引用,让它指向"1234",然后在方法里又让它指向"welcome",而main方法里的str没有一点变化。所以要用全局变量。
    为了证明不是传引用或者传值的原因,可以另外写个方法,改变int的值。
    综上,
    public class TT {
    static String str;
    static void changeStr(String s){
    str="welcome";
    }
    static void changeA(int a){
    a=10;
    }
    public static void main(String[] args){
     str = "1234";
     changeStr(str);
     System.out.println(str);
     int a=0;
     changeA(a);
     System.out.println(a);
    }
    }输出:
    welcome
    0
      

  17.   

    string是不可变的,StringBulider是可变的
      

  18.   

    1.Java中方法的传递都是值传递
    2.定义的String都是局部变量
    3.String的值是不会改变的…
      

  19.   

    public class TT {
        static String changeStr(String str){  //在该方法里声明了一个str, str="1234"
         str = "welcome";  //该方法的str="welcome" 
             return str; //返回str="welcome"
        }
        public static void main(String[] args){
         String str = "1234";
         str = changeStr(str); //将 str="1234"传递,并将changeStr方法的返回值赋给str
         System.out.println(str); 
        }
    }
      

  20.   

    String是基本的数据类型,不能地址传递的
      

  21.   

    String是引用类型没错,但确实特殊的引用类型,因为它的传递方式是以值传递方式进行的!如果想修改str的值可以把他改为stringbuffer类型的!
      

  22.   

    运行changeStr方法后str先是指向"1234",运行str="welcom"后内存重新分配,str指向了重新分配的内存(用于存储"welcom")。调试可以看到出来。
      

  23.   

    其实感觉楼主实质在问的其实是内存问题,不管什么语言只要你了解了内存机制学起来就相对容易一些,本人菜鸟只是发表写我的意见,从始至终楼主写的程序都是对的没有错误,程序也按照楼主的意愿执行,首先是main方法中的str="123",首先java会在栈中分配一块区域,给str这个引用,指向的地址是123,这个时候调用changeStr方法,方法中有个srt="welcom",java还会一样在栈中找是否有str这个引用,这个时候找到了 str引用指向123,但是由于程序没有运行完 所以jvm不会清理垃圾所以str依然存在 只是这次引用的地址改变了 开始指向welcom了,当运行完changeStr时 回到main函数时由于main中str是指向123的所以main中的str值没有改变,当运行完毕后,jvm将清理栈中的引用,程序最后执行完毕。
      

  24.   

    java中参数传递,属于单向传递,相当于传入了参数的一个副本,你修改的只是副本;如果传入的是一个对象,则是传入对象指针的一个副本,俩个指向同一个对象,所以你如果修改对象属性,所指向的那个对象就会发生改变。
      

  25.   

    public static void ChangeStr(String str) 

    str="welcome"; 
    } 这里面的str它的使用范围不会超过这对大括号
       
     如果你外面没申请str的字符串引用
      你使用这个变量 系统会提示你找不到值 记着 任何变量的使用范围都不会超过 定义它那对大括号
      只有一种出外  当这变量是定义在类里头的  可以有一种方式
     那就是"对象.变量" 如果是静态的就是    "类.变量"
      所以 你这里的两个str实际上是两个完全不同的变量
      

  26.   

    String作为参数时是传递的是对象的引用,
    str="welcome";//就等于重新给str一个引用。
    所以在调用的地方没有被改变。
      

  27.   

    对于按值传递还是按引用传递的问题,在java基础里面是一个很常见、很重要的知识点。建议你去找个初级的视频好好看看,java私塾的初级视频对这个问题有非常详尽的讲述,有在线的,免费,哈哈
      

  28.   

    ChangeStr(str)里的str是复制品
      

  29.   

    lz,你的例子确实是引用传递,但是你的变量str是局部变量,如果str是成员变量,就是你想要的结果了。