一个String值不会改变问题

 class Ref{
    String temp = "Hello";
}
public class StringProblem {


    public static void main(String[] args) {
        String str1 = "hello";
        System.out.println(str1);//输出"hello"
        change(str1);
        System.out.println(str1);//输出"hello"
        Ref ref = new Ref();
        System.out.println(ref.temp);//输出"Hello"
        change(ref);
        System.out.println(ref.temp);//输出"world"
    }
    public static void change (String str ){
        str = "world";
    }
    public static void change (Ref str ){
        str.temp = "world";
    }
}

为什么str1的值不会修改 ref.temp的值会修改?

图片说明
自己分析

这是当然,因为函数没有办法改变引用,但是可以修改对象。
你的第一段代码修改了str的引用,而不是修改对象本身,好比
public static void change (Ref str ){
Ref ref = new Ref();
ref.temp = "world";
}
这肯定也是不行的。

图片说明
第一次回答,不知道图能不能正常显示
1:在main方法运行时,main方法入栈,在局部变量表里面有一个str1,指向了堆里面的hello
2:运行change方法时,change方法入栈,在局部变更表里面有一个形参str,并把str也指向了堆里面hello所在的内存地址(因为从main传递到change传递的是内存地址)
3: 在change方法里面又把str指向了堆中world所在的内存地址。但是main方法里面的str1指向的地址又没有发生变化,所以值还是hello

直接被被String的变量值是不会改变的,这个是特性,记着就好了,如果被二次赋值,它本身的值 就会被修改

如果是使用非引用 指针,传递一个地址进去,就比传递对象好

根据java编程思想里面的说法,String对象具有不变性,在调用String对象时,实际上是使用了String 对象的引用的一个拷贝,而String对象的引用仍然
指向该对象没有变化。而第二个change传递进去的是Ref类型的对象,则会变化。

你修改的只是引用,但是原来的值却没发生变化

可以老驴用StringBuffer解决问题

一句话总结:对于String来说**_是值传递而非引用传递_**

这个问题其实就是问Java是值传递还是引用传递。

值传递只会将值传递不会改变他本身的值,引用传递是按址传递,因为公有一块空间,所以值会被改变。第一个是值传递,所以本身的值不会被改变,而第二个是引用传递,所以值被改变了