String类为什么是final的

String类为什么是final的

首先,先得清楚 final 这个关键字。 
final的出现就是为了为了不想改变,而不想改变的理由有两点:设计(安全)或者效率。
final 修饰的类是不被能继承的,所以 final 修饰的类是不能被篡改的。 
了解了这一点,我们再看看问题:

1、从设计安全)上讲, 
1)、确保它们不会在子类中改变语义。String类是final类,这意味着不允许任何人定义String的子类。
换言之,
如果有一个String的引用,它引用的一定是一个String对象,而不可能是其他类的对象。 
2)、String 一旦被创建是不能被修改的,
因为 java 设计者将 String 为可以共享的,下面这段是源码中的注释:

  1. /** 
  2.  * The {@code String} class represents character strings. All 
  3.  * string literals in Java programs, such as {@code "abc"}, are 
  4.  * implemented as instances of this class. 
  5.  * <p> 
  6.  * Strings are constant; their values cannot be changed after they 
  7.  * are created. String buffers support mutable strings. 
  8.  * Because String objects are immutable they can be shared. For example: 
  9.  *     String str = "abc"; 
  10.  * is equivalent to: 
  11.  *     char data[] = {'a', 'b', 'c'}; 
  12.  *     String str = new String(data); 
  13.  */  
  14.  对应翻译:  
  15. /**  
  16. *字符串类表示字符串。所有  
  17. *在java程序中的字符串,如“ABC”,是  
  18. *实现为这个类的实例。  
  19. *  
  20. *字符串是常量,它们的值在它们之后不能更改  
  21. *创建。支持可变字符串字符串缓冲区。  
  22. *因为字符串对象是不可改变的,它们可以共享。  

2、从效率上讲: 
1)、设计成final,JVM才不用对相关方法在虚函数表中查询,而直接定位到String类的相关方法上,提高了执行效率。 
2)、Java设计者认为共享带来的效率更高。

总而言之,就是要保证 java.lang.String 引用的对象一定是 java.lang.String的对象,而不是引用它的子孙类,这样才能保证它的效率和安全。


看了上面的,其实还可以看看这3个文章,有个常量池的概念。不仅仅是String类,还有简单数据封装类。加深下理解,扩展下知识面。

java,西特。

Java常量池的大概理解

Java常量池的面试题
阅读更多
个人分类: 面试
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭