黑马程序员技术交流社区

标题: String类? [打印本页]

作者: 李柯    时间: 2012-4-15 07:40
标题: String类?
String这个类型的类为何要定义成final?
作者: 王德南    时间: 2012-4-15 08:01
String和其他基本类型不同,他是个对象类型.既然是对象类型,如果是在静态方法下是必须调用静态方法或值的,如果是非静态的方法,就必须要实例化.
main函数是个static的.所以String要能像其他的基本类型一样直接被调用.这也是为什么在main函数下使用String类型不会报告错误的原因.另外,若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。


作者: 马强    时间: 2012-4-15 08:02
本帖最后由 马强 于 2012-4-15 08:13 编辑

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

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

又看了一下文档,值得改变跟final没关系,还是没学好,final的定义是为了不让他继承,
改变String内的内容,就必须改变String对象内部的char数组,但是jdk没有提供这样的方法,
也就是为什么String内容不能改变的原因,跟final没关系。
作者: 熊玖帅    时间: 2012-4-15 08:04
主要是为了考虑效率和安全性,和性能,所以被定义成finall
作者: 刘占月    时间: 2012-4-15 08:13
怎么说呢,就假如创建一个String对象:

private static final String x = "abcdefg";

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

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

所以会很好的提高效率
作者: 魏明明    时间: 2012-4-15 08:17
因为string的使用非常频繁,里面的方法已经很完善,考虑“效率” 和 “安全性” ,若 String允许被继承, 可能会降低程序的性能,所以String被定义成final。
作者: 韩新凯    时间: 2012-4-15 23:19
主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2