java中的String为什么是不可变的

我们都知道在java中String是不可变的

那么什么叫不可变?

百度百科给出:

在面向对象及函数编程y语言中,不可变对象是一种对象,在被创造之后,它的状态就不可以被改变。

我们可理解为:

一个对象创建完成之后,它的状态就不能再改变,包括的对象里面的成员变量,基本数据类型的值都不能改变,这样就叫做不可变对象

理解定义不叫简单,但是实际情况下我们总会混淆引用与对象,进而以为String可变,比如下面代码:

        String s = "abc";
        System.out.println(s);
        s = "123";
        System.out.println(s);

输出:

那么是String类型的s发生变化了才将abc改变成了123吗?

显然不是的,s只是一个引用,真正的对象是后面的abc和123,所以在内存中的关系这样的

 abc对象并没有改变,而是将引用重新指向了一个新的对象123.

我们再从源码的角度看

我们点进String类,可以看到String类是被final修饰的。

 

final关键字的作用:

inal关键字修饰类, 修饰字段, 修饰方法,修饰局部变量,修饰方法的形参

final修饰类,表示最终类, 不能被继承,不能作为父类存在

final修饰字段,在定义时必须显示初始化, 不能被修改, 一般与static同时使用,所有字母都大写,称为final常量

final修饰方法,不能被覆盖(重写)

final修饰局部变量, 一旦初始化就不能再修改, 注意final修饰引用类型变量,是指这个变量不能再指向 其他对象 , 可以修改它的字段值

final修饰方法形参, 在方法体中不能修改final参数的值

我们看到第二条final修饰了类就不能被继承,就是最终类了,它的方法不能被继承重写

String类型的其实使用char类型的数组存放的,而这个数组也被final关键字修饰了 

在整个String类中并没有一个用来修改对象值的方法

综上我们说java 中的String是不可变的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值