A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 分解式 中级黑马   /  2014-2-15 19:43  /  2269 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String这个类型的class为何定义成final?,如是问题,求解答一下

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

7 个回复

倒序浏览
String这个类 是不可变化的字符串,所以final。而StringBuffer则是可变化的字符串,功能相对多;

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
因为string类一旦定义就不可改变,所以是final类
回复 使用道具 举报
String类型一旦定义之后不允许改变,本身就是final。但是说Java中的变量名是存储的是字符串内存的地址,String变量内存上的数据不允许改变,变得是指向的位置,而位置上的数据没变

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1

查看全部评分

回复 使用道具 举报
因为java语言不允许自定义的的类继承String类,继承就意味着赋写方法。
回复 使用道具 举报
主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。
回复 使用道具 举报
主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

其它答案一:

String和其他基本类型不同,他是个对象类型.既然是对象类型,如果是在静态方法下是必须调用静态方法或值的,如果是非静态的方法,就必须要实例化.
main函数是个static的.所以String要能像其他的基本类型一样直接被调用.这也是为什么在main函数下使用String类型不会报告错误的原因..
一下就解释了两个心里的疑问..
以前一直觉得奇怪,为什么String是对象类型在main函数下却是不需要实例化的.再次佩服java设计人员想得真周到.



其它答案二:

当定义String类型的静态字段(也成类字段),可以用静态变量(非final)代替常量(final)加快程序速度。反之,对于原始数据类型,例如int,也成立。

例如,你可能创建一个如下的String对象:

private static final String x = "example";

对于这个静态常量(由final关键字标识),你使用常量的每个时候都会创建一个临时的String对象。在字节代码中,编译器去掉”x”,代替它的是字符串“example”,以致每次引用”x”时VM都会进行一次哈希表查询。

相比之下,度于静态变量(非final关键字),字符串只创建一次。仅当初始化“x”时,VM才进行哈希表查询。
回复 使用道具 举报 1 0
final是最终的意思,有点像常量一样,他不可以被修改,最终值,只能使用,不能修改。就像圆周率3.14一样,可以使用,但是不能被修改
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马