String的不可变

String是被final修饰的类,所有看起来会修改String值的方法都是创建了一个新的String对象。
所以这里要注意的是,String类型实例的传递永远是值传递,而不是引用传递如下代码

public class TestDemo{
     String string = "99";
     char[] c = {'a','b','f'};
     Nimaha nimaha = new Nimaha() ;
    public static void main(String[] args) {
        TestDemo testDemo = new TestDemo();

        testDemo.change(testDemo.string,testDemo.c,testDemo.nimaha);
        System.out.println(testDemo.string+" "+testDemo.c[0]+" "+testDemo.nimaha.a);

    }
    public void change(String string,char[] c,Nimaha nimaha){
        string = "ddd";
        c[0] = 'd';
        nimaha.a =2;
    }
    class Nimaha{
         int a =1;
    }
}
最终输出的结果应该是"99 d 2"因为传入change的String是传入了test.str的一个副本,char[] 和nimaha是真的传入了实例对象。
如果想要让str改变,应该在change中使用this关键字,具体情况如下
public void change(String string,char[] c,Nimaha nimaha){
    this.string = "ddd";
    c[0] = 'd';
    nimaha.a =2;
}

最后记录下:
堆区:只存放类对象,线程共享;
方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;
写在最后,个人猜测所有放在常量池里面的数据,到最后都是数值引用。而对象,比如对象数组,比如自己定义的class都算作对象引用,都是可以直接引用对象改变数值的,是不是存在栈上面的数据就是数值引用?如果有大神看到了可以说一下。

发布了43 篇原创文章 · 获赞 1 · 访问量 1万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章