tags: Java基础
String与final之间的关系
我们在学习java的时候可能会经常提到一个知识点:String是一个不可变类。
对于不可变类,我们又想到了final这个关键字了。
有的书也会说,String是final类。
而在实际中,我们对于final关键字和String不可变类的理解可能会有些偏差...
String是不可变类
怎么理解String是一个不可变类这么一句话呢??
我们常常使用字符串是这样子的,看如下的代码:
String s = "aaa";
s="bbb";
复制代码
这样的代码**是没有错误的。**那你又说String是不可变类,这是怎么回事呢???
String不可变类的意思是:我们的"aaa"字符串是不会被修改的,并不是String 的变量s不会改。
String的变量s只是改向了对字符串的引用,并没有修改我们的字符串值。
那对于String的不可变有什么好处??
- 好处就是我们可以共享字符串
- 当别的其他需要"aaa"这么一个字符串值的时候,编译器会去找我们的常量池(装载我们字符串的地方),看有没有"aaa",如果有的话,那么系统就不用再次创建了,直接用就行了。
理解final
上面理解了String不可变类的意思了,那final不是修饰在String类上面吗??final的意思不就是不能修改引用的值吗??
如果final修饰在类上的话,那么表明的是:它不能有子类
如果final修饰在变量上的话,那么它就是表明不能修改变量的引用!
明确了这点以后,我们就能理解final与String之间的关系了
- final修饰的是String类【说明String类不能被继承了】
- final如果修饰了String类型的变量,那么这个变量连set方法我们都可以不用给了
- 因为String本来就是一个不可变类【String字符串值不能被修改】
- 并且修饰成final的话,String 变量的引用也不能修改了。
- 因此,它就是一个常量。
还有值得说明的是:final仅仅是不能修改该变量的引用,但是引用里边的数据是可以改的!
private final User = new User("aaa","bbb");
user.setName("ccc");
复制代码
上面的操作是没问题的。我们的引用是没有变,变的只是引用内部所对应的值而已。
如果您觉得这篇文章帮助到了您,可以给作者一点鼓励