String的不可变

本文详细解释了Java中String类型的值传递特性,并通过具体代码示例展示了如何区分值传递与引用传递。此外还讨论了不同数据类型在内存中的存储位置及其影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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都算作对象引用,都是可以直接引用对象改变数值的,是不是存在栈上面的数据就是数值引用?如果有大神看到了可以说一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值