应几个法国巴西和印度小程序员的邀请,
我每周在Facebook上发布Java系列小文章,与你们也共享一下。
翻译 | 王楷涵
不能,String类是final的,因此它不能被覆盖。
这是String类的声明:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
}
在Java语言规范中,String类是不可变的,也就意味着在创建后就不能被改变了。这使得它们可以在整个JVM的范围内共享,换句话说,两个字符串变量将引用同一个字符串实例,从而获得使程序获得更好的性能。
如果String类不是final的,其子类就会有能力给出不同的实现。例如,字符串可用作类加载的参数,如果其可变,因很容易被修改,则可能导致加载错误的类。这将造成极其恶劣的安全问题。同样的事情也发生在网络编程中,因为套接字的参数通常也是字符串。
但我们知道,关键字final只能阻止这个类被覆盖,但不能阻止字符串的内容被修改。例如:
final char[] chrs = {'a','b','c'};
因为数组chrs已经被声明成final,所以其不能被修改成如下这样:
chars=new char[]{'a','b','d'};
对于这个语句,编译器将提示一个错误:
The final local variable chrs cannot be assigned.
但我们可以用如下的居于修改数组中的内容:
chrs[2]='d';
为了保护字符串对象中的内容,Java将数组声明成private final。
在Java8中:
private final char[] value;
而在Java11中:
private final byte[] value;
小贴士
返回上一级微信公众号对话框
回复“ m“ 关键词即可获取相关开发工具推荐。
回复“书籍”关键字即可获取相关书籍推荐。
回复“资源”关键字即可获取开发资源大全。
回复“666”关键字即可获取《面试宝典》。
回复“1024”关键字试试?
下方菜单栏点击餐饮部-Java餐-阅读原创书籍。
后续会持续更新更多书籍及优质资源推荐,敬请期待哦!
点击“阅读原文”,可进入原创书籍阅读目录