`

为什么jdk中把String类设计成final?(转载)

 
阅读更多

原文地址:http://blog.csdn.net/fenglibing/article/details/5486449

为什么jdk中把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才进行哈希表查询。
 

还有另一个解释

带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String。为String类指定final防止了人们覆盖length()方法。
 

  另外,如果指定一个类为final,则该类所有的方法都是finalJava编译器会寻找机会内联(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)  { // 
注意此处
 
//  

}

英文参考:http://forums.sun.com/thread.jspa?threadID=636414

=============================================================

另外补充一点:

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

分享到:
评论

相关推荐

    jdk中String类设计成final的原由

    在Java的JDK中,`String`类被设计为`final`的主要原因在于效率和安全性。首先,让我们深入了解这两个方面。 1. **效率**: - **字符串池**:Java中的`String`类广泛用于存储和操作文本。为了提高性能,Java引入了...

    jdk6-8String类

    在JDK的不同版本中,`String`类经历了一些优化和改进,尤其是在性能和内存管理方面。这里我们将对JDK 1.6、1.7和1.8中的`String`类进行对比研究,探讨其中的关键变化。 ### JDK 1.6中的String 在JDK 1.6中,`...

    浅谈为什么Java里面String类是不可变的

    那么,为什么 Java 语言的设计者要把 String 类型设计成不可变对象呢?下面,我们将深入探讨字符串不可变性的原因和优点。 不可变对象的定义 不可变对象指的是对象创建之后,对象的内部状态以及对象的内存指针地址...

    10个Java经典的String面试题

    创建了几个对象,为什么? 答案:创建了两个对象。"abc" 本身创建在常量池中,通过 new 又创建在堆中。String str = new String("abc"); 这一语句创建了两个对象:一个是常量池中的 "abc",另一个是堆中的 String ...

    jdk1.5中文api

    可以使用初始化块为类的实例变量提供默认值,即使变量声明为final也可以,如`final int i = {10};`。 7. **可变参数(Varargs)** 可变参数允许一个方法接受零个或多个相同类型的参数,如`public void print...

    解决JDK1.6下的Base64报错问题

    首先,我们需要理解为什么在JDK 1.6中会遇到Base64相关的问题。在JDK 1.8及更高版本中,Java引入了`java.util.Base64`类,提供了完整的Base64编码和解码功能。但在JDK 1.6中,这个类是不存在的,因此如果直接使用高...

    jdk1.8之后的String.intern()方法内存分析

    关于String.intern()方法,这个问题都被问烂了,有的文章在分析的时候还在用jdk1.7,jdk1.8之后内存模型发生了变化,内存的变化也会影响intern方法的执行,这里有必要写文章分析一下,请大家务必从头开始看,这样...

    JDK API 1.6.0 中文版

    **JDK API 1.6.0 中文版** 是Java开发者的重要参考资料,它包含了Java Development Kit (JDK) 1.6.0版本的所有公开的类、接口、方法和异常等详细信息,以中文语言呈现,便于中国开发者理解和使用Java编程语言。...

    JDK源码,整合所有内容

    - **对象和类**:Java是面向对象的语言,类是其核心,JDK源码中包含了大量内置类,如`Object`、`String`、`Exception`等。 - **接口与多态**:`interface`定义了类的行为规范,多态性是Java的一大特性,体现在方法...

    JDK1.6 api中文文档HTML版

    8. **枚举类型**:JDK1.5引入的枚举类型在JDK1.6中得到广泛使用,它提供了更安全的常量表示,避免了传统的public static final字段可能导致的错误。 9. **Swing和AWT**:`javax.swing`和`java.awt`包提供了图形用户...

    (String)字符串原理详解

    1、JDK1.8中String类的源码定义 1.1、主要的类变量如下所示: public final class String implements java.io.Serializable, Comparable, CharSequence { //存储字符串的字符数组 private final char value[]; /...

    jdk5_64.zip

    JDK5允许在方法签名中使用`...`来表示可变参数,比如`public void print(String... args)`。这种方式允许传入任意数量的字符串,提高了方法的灵活性。 七、注解(Annotations) 注解是JDK5引入的一种元数据,提供...

    Java常用类与基础API-String的理解与不可变性

    ##### (1) 对String类的理解(以JDK8为例说明) **1. 环境** 本文档使用JDK 8进行演示。JDK 8的环境设置确保了所有示例代码遵循JDK 8的语法规范。在JDK 9及更高版本中,部分语法可能有所不同。 **2. 类的声明** `...

    jdk1.6帮助文档中文版

    1. **java.lang**: 这是最基础的包,包括所有Java程序都自动导入的类,如Object、String、Integer等基本类型包装类,以及System、Class、Thread等核心类。 2. **java.util**: 提供了集合框架,包括List(如...

    JAVA_JDK_1.7

    使用`diamond operator`的类似机制,允许在匿名内部类中使用`final`局部变量,无需显式引用外部变量。 8. **Fork/Join框架**: 提供了一种并行执行任务的框架,通过`java.util.concurrent.ForkJoinPool`和`java....

    java jdk 5学习笔记

    在JDK 5之前,Java没有内置的枚举类型,开发者通常通过创建final类和static final变量来模拟枚举。JDK 5引入了enum关键字,使得枚举更安全、更易于使用,同时也支持枚举的继承和方法。 3. **泛型(Generics)**: ...

    jdk1.5

    1.5版本引入了自动装箱,即把基本类型自动转换为对应的包装类对象;反之,将包装类对象自动转换为基本类型,提高了代码的简洁性。 3. **枚举(Enums)**:JDK 1.5提供了枚举类型,用于定义一组固定的常量集合。枚举...

    Java中常用的加密方法(JDK)

    private static final String ALGORITHM = "AES"; public static byte[] encrypt(String key, byte[] data) throws Exception { SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), ALGORITHM); ...

    JDK5免安装解压包

    之前,Java中的常量通常通过final static变量实现,而JDK5引入了枚举类型,使得常量管理更加规范和安全。枚举可以包含方法和字段,甚至实现接口,提高了代码的结构化程度。 3. **自动装箱与拆箱(Autoboxing and ...

Global site tag (gtag.js) - Google Analytics