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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李柯 中级黑马   /  2012-4-15 07:40  /  1513 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String这个类型的类为何要定义成final?

6 个回复

倒序浏览
String和其他基本类型不同,他是个对象类型.既然是对象类型,如果是在静态方法下是必须调用静态方法或值的,如果是非静态的方法,就必须要实例化.
main函数是个static的.所以String要能像其他的基本类型一样直接被调用.这也是为什么在main函数下使用String类型不会报告错误的原因.另外,若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

回复 使用道具 举报
本帖最后由 马强 于 2012-4-15 08:13 编辑

毕老师说过得
字符串是常量它们的值在创建之后不能更改。
String s = "abc";//s1是一个类类型变量, "abc"是一个对象。
创建了就不能更改。
就算打印s变成别的,只是引用变了

---------------------------------------------------------------------------

又看了一下文档,值得改变跟final没关系,还是没学好,final的定义是为了不让他继承,
改变String内的内容,就必须改变String对象内部的char数组,但是jdk没有提供这样的方法,
也就是为什么String内容不能改变的原因,跟final没关系。
回复 使用道具 举报
主要是为了考虑效率和安全性,和性能,所以被定义成finall
回复 使用道具 举报
怎么说呢,就假如创建一个String对象:

private static final String x = "abcdefg";

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

相比之下,度于静态变量(非final关键字),字符串只创建一次。仅当初始化“x”时,VM才进行哈希表查询。

所以会很好的提高效率
回复 使用道具 举报
因为string的使用非常频繁,里面的方法已经很完善,考虑“效率” 和 “安全性” ,若 String允许被继承, 可能会降低程序的性能,所以String被定义成final。
回复 使用道具 举报
主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马