String s = new String("hello ");changeString(s);//changeString()   给s赋一个新的值System.out.println(s);书上给的解释是  对象引用指向的 字符串s 永远不会改变。传递对象引用,通过这个引用去创建了 一个新的 String 类型的字符串

解决方案 »

  1.   

    字符串“hello”是一个对象,是不变的,对象应用可以指向别的字符串,但是“hello”是不变的
      

  2.   

    我的意思是为什么 s 还是 指向的 原来的hello  ,这一点上我没搞懂!
      

  3.   

    因为字符串String是原子操作,当String作为参数传递时,它传递的是自身的副本,而不是内存地址 
    所以不管你changeString(s)究竟做了什么,都是对其副本进行的操作,该操作对于储存在堆栈中的源数据没有任何影响。
      

  4.   

    +1,不光是String,其他“引用”传递(其实是值传递)也是,都是通过副本来对原来的对象进行操作,改变副本是改变不了原来引用的指向的。
      

  5.   

    public class Test01 { public static void main(String[] args) {
    String s = new String("小王"); 
    changeString(s);  //该步 完成的动作是把s的地址值 传给了changeString方法中的形参s
                                          
                                          //  而并没有将原s的指向改变。所以最后的结果还是小王           System.out.println(s);  
    }
    //定义方法,重新给s赋值
    public static String changeString(String s){
    s = "小张";
    return s;
    }
    }解释不对的地方请大家指教。
      

  6.   

    String s = new String("hello ");
     是在字符池里创建一个属于S,存放“hello”的固定长度的块
    String 定义的变量是不可变长度的,StringBuffer 才可以变化。
      

  7.   

    我每周回答一次,String是常量。
      

  8.   

    这样记吧,单单的String 不是引用类型,值是不变的,和int一样
      

  9.   

    java采用的是形参模式,传入方法的对象参数其实是原变量的一个克隆(浅克隆,其实就是指向同一地址的另一个引用)。那当你修改一个String参数的值时:String是不可变的,当你修改一个String时,事实上我们重新创建了一个对象,然后将原引用指向这个新对象。  那么最终在这个方法中,你只是将一个原变量的引用指向了另一个地址。当然不会影响原变量的指向地址中的值。
    大概就是这个意思。不知道说明白了没。
      

  10.   

    因为java 说到底只有按值传递 如果想通过法改变String s的指向 可以把它作为一个类的属性然后传这个类的实例变量。 
      

  11.   

    java中基础类型是按值传参的,类还是按引用的,LZ自己可以写个简单的验证下
      

  12.   

    函数传参中数据类型如果是基本类型(int,String ...),对应变量的值不会改变
    如果想引用的话,可以用类
    举例
    class mystring{
    String str;
    }
    主函数
    String s=new String("hello");
    mystring mystr=new mystring();
    mystr.str=s;
    changeString(mystr);//changeString() 给s赋一个新的值
    s=mystr.str;
    System.out.println(s);
      

  13.   


    所以,这个在这儿string不是引用类型变量,仅是一个具体的值,所以在传递的过程不会改变的。