string类string为什么是线程安全的final的

对String的修改影响常量池内相同值但鈈同引用的其他变量


其他类的设计基于string不可变如set存储string,改变该string后set包含了重复值
安全性 如:对string的某一处改变一不小心就影响了该变量所有引用的表现

在回答这个问题之前我觉得有必要搞清楚final到底是个什么?

望文生义final意为“最终的,最后的”我理解为“不能被改变的”,它可以修饰类、变量和方法

所以我是否鈳以理解为被它所修饰的类、变量和方法都不能被改变呢?答案是”是“因为有以下约束条件的存在:

被final修饰的类不能被继承,即它不能拥有自己的子类否在会在编译期间报错。且看下面的例子:

第一步:创建一个用final修饰的父类Father

第二步:创建一个子类Son继承Father

如图所示我們看到了报警信息,点进去一看如下图所示:

意思就是类Son不能继承被final修饰的类Father,上面的结论得以印证

被final修饰的方法不能被重写,但是:

重写的前提是子类可以从父类中继承此方法所以当父类中被final修饰的方法的访问权限为private时,子类中就可以重写该方法了

(一)父类中嘚方法控制权限为public

第一步:在Father类中创建一个方法,并用final修饰

第二步:用类Son继承类Father并重写work方法

可以看到当子类重写父类中用final修饰的方法时報错了,报错信息如下:

即子类不能重写父类中被final修饰的方法

(二)父类中的方法控制权限为private

第一步:在Father类中创建一个方法并用final修饰

第②步:用类Son继承类Father并重写work方法

可以看到程序没有报错,黄色下划线的warning如下所示:

意为该方法没有被使用而当我把方法的控制权限改为public并苴不用final修饰时,一切继承和重写都是正常的如下图所示:

由此,第二条结论也得以印证

final修饰的变量,无论是类属性、对象属性、形参還是局部变量都需要进行初始化操作。

可以看到被final修饰的变量报错了报错信息如下:

意为被final修饰的字段language没有被初始化,所以当变量被final修饰时要赋值初始化如下:

类属性可以理解为一个将一个类作为另一个类的属性

第一步:先创建一个特征类

第二步:将特征类Feature设置为Son类嘚属性,并用final修饰

同样当类属性用final修饰时报错了报错信息如下:

同样,报错信息为没有进行对final修饰的类进行初始化下面看一下不用final修飾时是否报错:

很明显,答案是没有那再来看一下当初始化Feature类后又会是怎样的?

可以看到初始化用fina修饰的属性类后并没有报错,上面嘚结论也得以印证了!

结合以上基础知识我们来分析一下为什么String类是final的?

上面这个例子是让一个普通类继承String类,结果发现报错了错誤信息如下:

即类String1不能是final类String的子类,这里已经很明显地看出String类是final的但是到底是为了什么呢?先给出答案吧:

主要是为了”安全性“和”效率“的缘故因为:

1、由于String类不能被继承,所以就不会没修改这就避免了因为继承引起的安全隐患;

2、String类在程序中出现的频率比较高,如果为了避免安全隐患在它每次出现时都用final来修饰,这无疑会降低程序的执行效率所以干脆直接将其设为final一提高效率;

下面是我在其他人的博客中发现的一个很有趣也很有价值的答案,截图拿来参考一下这位高人的解释:

近给大家讲了一堂关于初学者如哬从零基础到就业正确的学习步骤在课堂中我提过两点困难是初学者最大的问题,其中一个问题就是学了后面忘了前面的问题还有一個最重要的问题就是编程思维。今天主要给大家讲一下初学...

我要回帖

更多关于 actionlistener接口 的文章

 

随机推荐