今天看到一篇名为《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 ...
随机推荐
-
Unity开发-你必须知道的优化建议
转自:http://blog.csdn.net/leonwei/article/details/18042603 最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的documen ...
-
SQL2008全部数据导出导入两种方法【转】
方法一:生成脚本导出导入sql2008全部数据 第一步,右键要导出的数据库,任务--生成脚本 第二步,在设置脚本编写选项处,点击--高级(A),选择要编写脚本的数据的类型为:架构和数据 如果找 ...
-
[转载] Linux内存管理之mmap详解
转载自http://blog.chinaunix.net/uid-26669729-id-3077015.html 一. mmap系统调用 1. mmap系统调用 mmap将一个文件或者其它对象映射进 ...
-
【js】深拷贝一文中的几个错误点
原文:https://www.cnblogs.com/wuhairui/p/10370227.html 得到网友反馈,试过后也再查了下资料: 1.JSON.parse(JSON.stringify(o ...
-
深入研究 Runloop 与线程保活
深入研究 Runloop 与线程保活 在讨论 runloop 相关的文章,以及分析 AFNetworking(2.x) 源码的文章中,我们经常会看到关于利用 runloop 进行线程保活的分析,但如果 ...
-
20155219 2016-2017-2 《Java程序设计》第2周学习总结
20155219 2016-2017-2 <Java程序设计>第2周学习总结 教材学习内容总结 类型:整数,字节(需要逐字节处理数据时,如图像处理,编码处理等,会使用byte类型),浮点数 ...
-
IIS挂起网站配置文件地址
“C/用户/Administrator/我的文档/IISExpress/Config/applicationhost”
-
onsyscommand
简介 OnSysCommand()这个函数主要是截获控制命令的,msdn上的解释如下: The framework calls this member function when the user s ...
-
yocto-sumo源码解析(二): oe-buildenv-internal
1 首先,脚本先对运行方式进行了检测: if ! $(return >/dev/null 2>&1) ; then echo 'oe-buildenv-internal: erro ...
-
sencha touch 评分扩展
原版 :https://market.sencha.com/extensions/sencha-touch-2-rating-star-field 效果: 我的改造版(只是类名变了): Ext.def ...