Java问题解读系列之String相关---String类为什么是final的?
今天看到一篇名为《Java开发岗位面试题归类汇总》的博客,戳进去看了一下题目,觉得有必要夯实一下基本功了,所以打算边学边以博客的形式归纳总结,每天一道题,
并将该计划称为java问题解读系列,今天的题目是:String类为什么是final的?
在回答这个问题之前,我觉得有必要搞清楚final到底是个什么?
一、理解final
望文生义,final意为“最终的,最后的”,我理解为“不能被改变的”,它可以修饰类、变量和方法。
所以我是否可以理解为被它所修饰的类、变量和方法都不能被改变呢?答案是”是“,因为有以下约束条件的存在:
1、final修饰类
被final修饰的类不能被继承,即它不能拥有自己的子类,否在会在编译期间报错。且看下面的例子:
第一步:创建一个用final修饰的父类Father

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

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

意思就是类Son不能继承被final修饰的类Father,上面的结论得以印证。
2、final修饰方法
被final修饰的方法不能被重写
详情且看下面的实例:
(一)父类中的方法控制权限为public
第一步:在Father类中创建一个方法,并用final修饰

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

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

即子类不能重写父类中被final修饰的方法
3、final修饰变量
final修饰的变量,无论是类属性、对象属性、形参还是局部变量,都需要进行初始化操作。
(1)修饰变量

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

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

(2)修饰类属性
类属性可以理解为一个将一个类作为另一个类的属性
第一步:先创建一个特征类

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

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

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

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

可以看到,初始化用fina修饰的属性类后并没有报错,上面的结论也得以印证了!
二、解答问题
结合以上基础知识,我们来分析一下为什么String类是final的?
首先来看一个例子:

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

即类String1不能是final类String的子类,这里已经很明显地看出String类是final的,但是到底是为了什么呢?先给出答案吧:
主要是为了”安全性“和”效率“的缘故,因为:
1、由于String类不能被继承,所以就不会没修改,这就避免了因为继承引起的安全隐患;
2、String类在程序中出现的频率比较高,如果为了避免安全隐患,在它每次出现时都用final来修饰,这无疑会降低程序的执行效率,所以干脆直接将其设为final一提高效率;
下面是我在其他人的博客中发现的一个很有趣也很有价值的答案,截图拿来参考一下这位高人的解释:

以上就是我通过调研对本次问题的理解,如有不足或错误之处,望看到这篇文章的你能给予指点和批评,未完待续......
Java问题解读系列之String相关---String类为什么是final的?的更多相关文章
- Java问题解读系列之基础相关---抽象类和接口
今天来说一波自己对Java中抽象类和接口的理解,含参考内容: 一.抽象类 1.定义: public abstract class 类名{} Java语言中所有的对象都是用类来进行描述,但是并不是所有的 ...
- Java问题解读系列之基础相关---含继承时的执行顺序
今天来研究一下含继承.静态成员.非静态成员时Java程序的执行顺序: 一.不含继承,含有静态变量.静态代码块 创建一个子类,该类包含静态变量.静态代码块.静态方法.构造方法 /** * @create ...
- Java问题解读系列之IO相关---Java深拷贝和浅拷贝
前几天和棒棒童鞋讨论Java(TA学的是C++)的时候,他提到一个浅拷贝和深拷贝的问题,当时的我一脸懵圈,感觉自己学Java居然不知道这个知识点,于是今天研究了一番Java中的浅拷贝和深拷贝,下面来做 ...
- Java问题解读系列之String相关---String、StringBuffer、StringBuilder的区别
今天的题目是String.StringBuffer和StringBuilder的区别: 首先还是去官方的API看看对这三种类型的介绍吧,Go...... 一.继承类和实现接口情况 1.String类 ...
- Java问题解读系列之String相关---String类的常用方法?
今天的题目是:String类的常用方法? 首先,我们在eclipse中定义一个字符串,然后使用alt+/就会出现String类的所有方法,如下图所示: 下面我就挑选一些常用的方法进行介绍: 首先定义两 ...
- java中关于Collection和Map相关的类&接口之间的关系
上图(引用自)
- Java NIO学习系列七:Path、Files、AsynchronousFileChannel
相对于标准Java IO中通过File来指向文件和目录,Java NIO中提供了更丰富的类来支持对文件和目录的操作,不仅仅支持更多操作,还支持诸如异步读写等特性,本文我们就来学习一些Java NIO提 ...
- JAVA基础5——与String相关的系列(1)
与String相关的系列 String, 是JAVA中常见的一个引用类型,且其具有一定的特殊性. String类型被设置为final型,即不可继承,也就不可修改其中的实现. String可以改变吗 S ...
- Java总结篇系列:Java String
String作为Java中最常用的引用类型,相对来说基本上都比较熟悉,无论在平时的编码过程中还是在笔试面试中,String都很受到青睐,然而,在使用String过程中,又有较多需要注意的细节之处. 1 ...
随机推荐
- ST(RMQ)算法(在线)求LCA
在此之前,我写过另一篇博客,是倍增(在线)求LCA.有兴趣的同学可以去看一看.概念以及各种暴力就不在这里说了,那篇博客已经有介绍了. 不会ST算法的同学点这里 ST(RMQ)算法在线求LCA 这个算法 ...
- vue-router动态路由控制
一.注册使用vue-router import Vue from 'vue' import Router from 'vue-router' Vue.use(Router); 二.编写动态路由注册函数 ...
- QQ交流群
- iframe跨域数据传递
项目中需要和其他单位合作开发,方案采用iframe嵌入页面,开发过程中设计到了跨域数据的传递,初步方案决定使用html5 API postMessage进行iframe跨域数据传递: 域名A下的页面 ...
- jun引导1.04可以让N3050支持6.2
1.03引导用在3050可以安装 但是安装后找不到dsm 需要手动插拔电源才可以解决 偶尔还会死机 1.04可以引导3050安装6.2 23739 安装24922正常,但是moments传照片后会死机 ...
- JavaEE三层架构
三层架构 三层架构是javaee规范中的推荐架构,传统意义上是分为表示层(UI).业务逻辑层(BLL).数据访问层(DAL).在javaee的开发中,三层架构具体分为表示层(web层) ...
- Python学习day12-函数基础(2)
<!doctype html>day12博客 figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { pos ...
- Django项目: 3.用户注册功能
本章内容的补充知识点 导入库的良好顺序: 1.系统库 2.django库 3.自己定义的库(第三方库) redis缓存数据库的数据调用速度快,但是不利于长时间保存. mysql用于长时间存储,但是调用 ...
- Laravel 指定日志生成目录
1.在config/logging.php 中, 创建自定义频道 2.使用时指定频道
- VS中添加配置X86平台
最近IIS发布程序时,总是容易碰到下面的错误.这个错误网上绝大部分都是提出在VS把解决方案设置为在X86平台生成,然后再发布.但是查看应用程序后发现没有X86平台选项,下面是添加X86目标平台的方法.