例如:
String s1="abc";
System.out.println(s1.hashCode());
s1="efg";
System.out.println(s1.hashCode());
既然是常量,s1就不应该再被赋值了,那为什么程序还能运行,最后打印s1的结果是“efg”
利用s1.hashCode()打印出来的hashCode也不一样String类型的对象是常量到底应该怎么理解?

解决方案 »

  1.   

    常量是指内存区的内容不能被改变,也就是"abc"这块内存区不能改变,即不能变为"acd"之类的,常量不是指s1,是指"abc"这个字符串本身
    s1是个变量,他引用的是"abc"这个常量的地址,既然s1是变量,当然能重新赋值了,所以可以s1="efg",让s1引用"efg"常量
    这里要注意,s1本身不是对象,只是个变量标示,"abc"和"efg"才是对象,是个字符串对象,s1只是引用这些对象
      

  2.   

    String s1="abc";
    s1="efg";
    改变的是s1的值,并不是"abc",s1是一个指针,占4个字节,"abc"是字符串对象。
    考虑其他的对象:
    class AA{
       String name;
       int age;
    }
    AA a = new AA();
    a.name = "hello";
    a.age = 10;
    对于a这个对象,它的内容是可以改变的,比如:a.name="world";a.age=20;这样a这个指针指向的对象的内容就改变了。
      

  3.   

    1楼正解,简单的说就是s1的指向变了
    "abc","efg"两个字符串还是在那里没有变
      

  4.   

    补充一点,如果想让s1不能变,要加上final
    即 final String s1 = "abc";