jdk中String类设计成final的原由_java

最佳答案
主要是为了 “ 效率 ” 和 “ 安全性 ” 的缘故。 若 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 才进行哈希表查询。
还有另一个解释:
带有 final 修饰符的类是不可派生的。 在 java 核心 API 中,有许多应用 final 的例子,例如 java.lang.String。 为 String 类指定 final 防止了人们覆盖 length() 方法。
另外,如果指定一个类为 final,则该类所有的方法都是 final。 java 编译器会寻找机会内联(inline)所有的 final 方法(这和具体的编译器实现有关)。 此举能够使性能平均提高 50%。
示例:

复制代码 代码如下:

public class Test {
public static void main(String[] args) {
//
}
}

如果 String 不是 final 那么就可以继承

复制代码 代码如下:

public class String2 extends String{
//..
//...
}

那我们的 main 也就可以写成

复制代码 代码如下:

public class Test {
public static void main(String2[] args) { // 注意此处
//
}
}

另外补充一点
作用就是 final的类不能被继承,不能让别人继承有什么好处?
意义就在于,安全性,如此这般:
java 自出生那天起就是“为人民服务”,这也就是为什么java做不了病毒,也不一定非得是病毒,反正总之就是为了安全, 人家java的开发者目的就是不想让 java干这类危险的事儿,java并不是操作系统本地语言, 换句话说java必须借助操作系统本身的力量才能做事,JDK中提供的好多核心类比如 String,这类的类的内部好多方法的实现都不是java编程语言本身编写的, 好多方法都是调用的操作系统本地的API,这就是著名的“本地方法调用”,也只有这样才能做事,这种类是非常底层的, 和操作系统交流频繁的,那么如果这种类可以被继承的话,如果我们再把它的方法重写了,往操作系统内部写入一段具有恶意攻击性质的代码什么的, 这不就成了核心病毒了么?
上面所述是最重要的,另外一个方面,上面2位老兄说的也都很对, 就是不希望别人改,这个类就像一个工具一样,类的提供者给我们提供了, 就希望我们直接用就完了,不想让我们随便能改,其实说白了还是安全性, 如果随便能改了,那么java编写的程序肯定就很不稳定,你可以保证自己不乱改, 但是将来一个项目好多人来做,管不了别人,再说有时候万一疏忽了呢?他也不是估计的, 所以这个安全性是很重要的,java和C++相比,优点之一就包括这一点;
原因绝对不只有这么多,因为如果这些个核心的类都能被随便操作的话,那是很恐怖的,会出现好多好多未知的错误,莫名其妙的错误….

时间: 2024-09-15 20:22:52

jdk中String类设计成final的原由_java的相关文章

java中string类转成timestamp类

问题描述 java中string类转成timestamp类 java中string类转化成timestamp时,调用了timestamp的valueof()方法,但是转换后是还有小数点的,想去掉小数点,但还是timestamp类型,该如何做呢?说明下,string是存放类似日期格式的字符串.谢谢各位大神的指导,在下感激不尽. 解决方案 timestamp本身就是带毫秒的.如果要输出用,还是的格式化成string输出.如果数据库要存储用,可以转成date后,用date.gettime()获取lon

String被设计成不可变和不能被继承的原因

String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了一个字符串池(String pool),这使得String成为了一个特别的类. 主要是为了 " 效率 " 和 " 安全性 " 的缘故. 若 String 允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以 String 被定义成 final.   一:String 和其他基本类型不同 , 他是个对象类型. 既然是对象类型 , 如果

java源码-为什么jdk中的类不能被重写啊?

问题描述 为什么jdk中的类不能被重写啊? 是jvm有什么保护措施吗?我的意思就是,假设:我自己写一个String类会和jdk中的冲突,也就报错,写不了,为什么呢?跪求 解决方案 这是Java的类加载机制决定的,Java使用的是委托父类加载,所有的Java类库都是由指定的类加载器加载的,即使你定义一个一模一样的String类,最终引用加载的仍然是Java类库的类.这就是Java防止篡改的原理. 解决方案二: 当然是这样,否则很可怕了.比如说你的程序中有一个加密的逻辑,有人编写一个恶意的插件程序,

java中 String类常量池

java中 String类常量池 String常量池详解: 1.String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容,就是因为如此,才说String类型是不可变的(immutable).String类有一个特殊的创建方法,就是使用""双引号来创建.例如new String("i am")实际创建了2个 String对象,一个是"i am"通过

string-java中 String类问题<初级程序员的自我修远>

问题描述 java中 String类问题<初级程序员的自我修远> 刚学习java语言 我看String中源码写的 private final char[] c; 为什么在自己的类中这样写就会报未初始化的错误 解决方案 private final char[] c = new char[长度]; 解决方案二: final char[] c这样写的话,c就不能再指向别的引用,但是你又没给人家初始值,编辑器自然不干了. 解决方案三: 有final属性,要有构造器,并且初始化该属性 public cl

分享C++面试中string类的一种正确写法_C 语言

具体来说: 能像 int 类型那样定义变量,并且支持赋值.复制. 能用作函数的参数类型及返回类型. 能用作标准库容器的元素类型,即 vector/list/deque 的 value_type.(用作 std::map 的 key_type 是更进一步的要求,本文从略). 换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误. 复制代码 代码如下: void foo(String x)  {  }  void bar(const String& x)  {  }  Str

string-java中String类两种初始化的区别

问题描述 java中String类两种初始化的区别 解决方案 首先,你得理解下JAVA的存储区主要有三个:栈.堆.静态区.这三个的生命周期不一样,分配方式也不一样,存储内容也不一样 String a="aaa"这里的aaa存放就是在静态区,如果还有后头又定义一个string b="aaa",那么java里头会把它也指向a指向的地方.整个aaa会一直等到你程序退出了才释放空间 而String a1=new String("aaa").这里aaa是放

string-java 中 String 类连接问题

问题描述 java 中 String 类连接问题 String str1 = "aa" ; String str2 = "bb" ; String str3 = "aa" + "bb" ; String str4 = str1 + str2 ; boolean b =(str3 == str4); System.out.println(b); 这里b为什么是false , 有那个大侠能否帮忙回答下? 解决方案 编译的时候,aa

C++中string类的一种正确写法(面试题)

c++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 了解string类   在我们研究string类犯了什么毛病之前,还让我先说一下如何了解一个C++的类.我们要了解一个C++的类,一般来说,要从三个方面入手.   一.            意图(Intention).知其然还要知所以然,string类的意图是什么?只有了解了意图,才知道它的思路.这是了解一个事物最重要最根本的部分.不然,你会