当前位置: 代码迷 >> J2EE >> String 类型的是final 不是说final类型的不可以修改吗 为啥小弟我可以修改String变量的值
  详细解决方案

String 类型的是final 不是说final类型的不可以修改吗 为啥小弟我可以修改String变量的值

热度:77   发布时间:2016-04-17 23:08:55.0
String 类型的是final 不是说final类型的不可以修改吗 为啥我可以修改String变量的值
String  s = "123"  ;
      void test () {
        s="456"; 
        System.out.println(s);
      }
     public static void main(String[] args) {

new  Test8().test();
}

s是String类型的  一开始赋值是"123"
后来我把它改成了"456"
不是说String 类型的不可以修改的吗
------解决思路----------------------
你要知道String指向的是堆上一块内存地址,那块里面的东西是可以改变的,只是说这个引用指向的地址不能变
同时 String类做过特殊处理 任何试图改变原对象的方法所获得的都是原对象的一个拷贝
------解决思路----------------------
final 用来修饰类,表示此类不可以被继承,也就是此类没有子类
对于String来说,如果一个变量str的类型是String的,那么str.class==String.class一定是成立的
如果不是final类,如Student继承Person类,那么 Person p=new Student(),那么显然p.class !=Person.class
还有一点,String类的里面的很多属性是final的,也就是说不能通过反射来改变里面字段的值

lz你改变的变量的引用或指针,并不是改变了变量所指向的那个对象的值

当然如果变量用final修饰,那么此变量也不可重新赋值的(指向另外一个对象)
------解决思路----------------------
String不是final的,而是Immutable(不可变类),即属性值不可变,你可以简单理解为一个字符串对象的内容不可变
为什么可以二次赋值?
当你第二次为一个String变量赋值时,实际上是重新创建的一个String对象,将这个新创建的对象引用赋值给之前的String变量,也就是说这个时候产生了两个对象,而不是同一个对象改变了值。
  相关解决方案