String与final

  • Post author:
  • Post category:其他



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");

复制代码

上面的操作是没问题的。

我们的引用是没有变,变的只是引用内部所对应的值而已。

如果您觉得这篇文章帮助到了您,可以给作者一点鼓励