java string是final_Java问题解读系列之String相关---String类为什么是final的?

今天看到一篇名为《Java开发岗位面试题归类汇总》的博客,戳进去看了一下题目,觉得有必要夯实一下基本功了,所以打算边学边以博客的形式归纳总结,每天一道题,

并将该计划称为java问题解读系列,今天的题目是:String类为什么是final的?

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

一、理解final

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

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

1、final修饰类

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

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

836d4e3b4a9ef057cb429b8115d82fd4.png

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

855f4addf35410c8f6c11453724b8201.png

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

8f440459bc1ebe504098cc37e3675a50.png

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

2、final修饰方法

被final修饰的方法不能被重写

详情且看下面的实例:

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

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

8c77727a0f0bbf9c2c6aa437e22e94ab.png

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

f7cb361771af81052242f2be1e0da9d0.png

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

36561c47f96f46a71b191f08e8652997.png

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

3、final修饰变量

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

(1)修饰变量

afe890aa8f2837f821d074ce3a720a12.png

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

0de697d5d9e139e28652d4a79e6a92f3.png

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

3ee1fecf5d5cfd0c64ae3d58ee0c5f07.png

(2)修饰类属性

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

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

d569d847bcf8c86dec5d523fb6a518ac.png

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

0131b92fc5239070903c58d3f3d2a53c.png

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

bdfad56b66f8ece8b1d9efd919bfc054.png

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

fa054296f9f659081b79b649427da8ae.png

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

5c00da9e85b4600f60eb24ad26ed34b9.png

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

二、解答问题

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

首先来看一个例子:

afaf8c26907b190ed2eb9c37ec791a53.png

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

bdde5a199adfcd00355143a34b945f8c.png

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

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

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

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

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

0f982af58fe63204fb18476f4e646b3c.png

以上就是我通过调研对本次问题的理解,如有不足或错误之处,望看到这篇文章的你能给予指点和批评,未完待续......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值