欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

String不可变?final修饰的变量不能变?

程序员文章站 2022-07-14 11:27:45
...

以下都是个人见解,如果有错误,希望能指出来,我会修改的。

【final】可修饰类,方法,变量。
如果修饰类,则该类无法被继承。
如果修饰方法,改方法无法被重写。
如果修饰的是变量,基本数据类型无法被赋予其他值;引用数据类型无法指向其他对象。但是指向对象的值是可以改变的。(例如我只能指向蛋糕店,不能指向其他地方,但是今天可以在蛋糕店吃蛋糕,明天也可以在蛋糕店吃面包,对象的值是可以改变的)
String不可变?final修饰的变量不能变?


【不可变】是指双引号内的字符串一旦创建就不可改变。
例如:

// String s1="abc";
//s1="123";
这里,创建了对象“abc”,而"abc"一旦创建,就会在字符串常量池里,永远不会改变。而s1可以指向其他变量。改变的是s1保存的内存地址。

【String为什么不可变】在JDK14 java.lang.String 源码。
如下:

// String码源 其中的片段
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {
    @Stable
    private final byte[] value;

String被final修饰,说明该类不可继承。
byte[] value被final修饰,说明value的引用在创建之后不能被改变。

// String s="abc";//以该代码为例,简单谈一下我个人的理解。

简单来说,解释Spring不可变就是解释"abc"是"abc",而无法变成"abcd"。

注意:是指"abc"字符串本身永远无法改变,不是指s永远指向"abc"。

①首先创建了一个byte[] 数组,把"abc"放入数组。数组一旦创建,类型和长度无法改变。
②value被final修饰,value是引用,value所指向的内存地址不可变(永远指向"abc"所在的byte[]数组),不可以指向其他对象。
三,value被private修饰,只能本类访问,无法被子类,同包等外部程序直接访问访问。
String不可变?final修饰的变量不能变?
④有了保护性拷贝,不允许直接赋值给数组byte[],所以数组存储的是"abc"无法改变值。

【总结】value指向地址无法改变,指向地址的对象类型无法改变,长度无法改变,对象的值无法改变。所以String是不可变的。

由于本人入门较晚,水平有限,如果有错误希望大佬能指出,为了照顾广大初学者,尽量解释的浅显易懂一些,十分感谢。