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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心是你仰望的城 中级黑马   /  2014-2-22 10:01  /  1857 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么java要把String类设计成final?而其他数据类型却没有呢?这样设计的好处哪里体现?可否举例说明下?谢谢。。。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

13 个回复

倒序浏览
内部类访问外部类的成员时需要将外部类的成员设置成final,加final修饰符的变量只能初始化一次,
至于楼主说的我我没太看懂

评分

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

查看全部评分

回复 使用道具 举报
关键字final意思:最终类,无法被继承,被修改。String类和8种基本数据包装类一样,都是一种数据类型,很多资源是跟本地资源相关的,如果可以继续和修改的化,可能会造成一些无法正常操作的情况。个人见解。(要看是否与底层相关,请看源代码)

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法,另外,如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联所有的final方法。此举能够使性能平均提高50%。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
我自己也说不清楚,网上查了一下,有一篇博客,讲的还行,一起学习一下吧!
http://blog.csdn.net/fenglibing/article/details/5486449
回复 使用道具 举报 1 0
itpower 发表于 2014-2-22 11:08
内部类访问外部类的成员时需要将外部类的成员设置成final,加final修饰符的变量只能初始化一次,
至于楼主说 ...

谢谢你的回答,我的意思是,String对象只能被赋值一次,这样子设计的好处是什么?
回复 使用道具 举报
用final修饰类,该类不能被继承;修饰变量的值不能被改变,必须赋值且只能赋一次值,初始化的方法有2个:在定义成员变量的同时初始化,或在类中所有的构造函数中初始化,只能选择其中一种方法;修饰方法,不能被重写。这样做的话就不能再继承String类了,也就不能再重写里面的方法。个人理解:它是一个比较常用、基础的数据类型,如果它被不合理的重写的话,有可能造成不合法操作,使程序不能正常进行,所以将之保护起来。

评分

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

查看全部评分

回复 使用道具 举报
把String类设计成final,主要是为了“效率” 和 “安全性” 的缘故。
String和其他基本类型不同,他是个对象类型.既然是对象类型,如果是在静态方法下是必须调用静态方法或值的,如果是非静态的方法,就必须要实例化,而main函数是个static的,所以String能像其他的基本类型一样直接被调用,这就是为什么在main函数下使用String类型不会报告错误的原因。
带有final修饰符的类是不可派生的。如果指定一个类为final,则该类所有的方法都是final。
Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关),这能够提高性能。
若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。

评分

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

查看全部评分

回复 使用道具 举报 1 0
 发表于 2014-2-22 18:05:13
9#
需要技术分的同学,快来回答问题哦!

 来自 黑马程序员训练营 的腾讯微博
回复 使用道具
哥们   挺你   加油  咱们北京见
回复 使用道具 举报
冷月 发表于 2014-2-22 18:18
哥们   挺你   加油  咱们北京见

你已经在上京的路上了吧?呵呵,祝你好运,有事跟我说。。。加油
回复 使用道具 举报
java中用String类进行描述。对字符串进行了对象的封装。这样的好处是可以对字符串这种常见数据进行方便的操作。对象封装后,可以定义N多属性和行为。
回复 使用道具 举报
心是你仰望的城 发表于 2014-2-22 19:18
你已经在上京的路上了吧?呵呵,祝你好运,有事跟我说。。。加油

嘻嘻  还差一点  
努力中………………
回复 使用道具 举报
有一个解释就是
当定义String类型的静态字段(也成类字段),可以用静态变量(非final)代替常量(final)加快程序速度。反之,对于原始数据类型,例如int,也成立。

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

private static final String x = "example";

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

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

还有另一个解释:
带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马