string为什么要被final修饰?
本问题来自云栖社区【阿里Java技术进阶2群】。https://yq.aliyun.com/articles/690084 点击链接欢迎加入社区大社群。
字符串是恒定的,创建之后它们的值不能被改变。StringBuffer是可变的strings.字符串对象不可变让它们可以被共享。
String作为一种对象类型,但是正如常见的,和基本类型出现,是不会发生变化的,一旦生成,对象不会改变,所以final修饰
不可变对象是指一个对象的状态在对象被创建之后就不再变化。不可改变的意思就是说:不能改变对象内的成员变量,包括基本数据类型的值不能改变,引用类型的变量不能指向其他的对象,引用类型指向的对象的状态也不能改变。
String 不可变是因为在 JDK 中 String 类被声明为一个 final 类,且类内部的 value 字节数组也是 final 的,只有当字符串是不可变时字符串池才有可能实现,字符串池的实现可以在运行时节约很多 heap 空间,因为不同的字符串变量都指向池中的同一个字符串;如果字符串是可变的则会引起很严重的安全问题,譬如数据库的用户名密码都是以字符串的形式传入来获得数据库的连接,或者在 socket 编程中主机名和端口都是以字符串的形式传入,因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子改变字符串指向的对象的值造成安全漏洞;因为字符串是不可变的,所以是多线程安全的
final用于定义不能继承的类 ,不能覆写的方法和常量。 一般定义比较多的全局常量
public static final int ON =1 ;
1.被final修饰的类,不可以被继承,所以不会别其它类改变,这样会更加的安全.
2.string是共享在常量池中的,String str="abc", char data[] = {'a', 'b', 'c'};是等价的,他们都放在了字符串常量池中.
一般string 被final 修饰是放在方法的形参里的, 首先string 是不可变的,加final 是为了了从静态检查上,不允许重复给一个string 变量赋值,这种做法是推荐使用的,可以参见erlang 中,所有的变量都是final 的,可以让代码更加已读,每次如果需要用一个新的值,重新申请一个新的变量即可。否则一个变量被反复赋值,代码可读性很差。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。