例如:
String s1="abc";
System.out.println(s1.hashCode());
s1="efg";
System.out.println(s1.hashCode());
既然是常量,s1就不应该再被赋值了,那为什么程序还能运行,最后打印s1的结果是“efg”
利用s1.hashCode()打印出来的hashCode也不一样String类型的对象是常量到底应该怎么理解?
String s1="abc";
System.out.println(s1.hashCode());
s1="efg";
System.out.println(s1.hashCode());
既然是常量,s1就不应该再被赋值了,那为什么程序还能运行,最后打印s1的结果是“efg”
利用s1.hashCode()打印出来的hashCode也不一样String类型的对象是常量到底应该怎么理解?
s1是个变量,他引用的是"abc"这个常量的地址,既然s1是变量,当然能重新赋值了,所以可以s1="efg",让s1引用"efg"常量
这里要注意,s1本身不是对象,只是个变量标示,"abc"和"efg"才是对象,是个字符串对象,s1只是引用这些对象
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这个指针指向的对象的内容就改变了。
"abc","efg"两个字符串还是在那里没有变
即 final String s1 = "abc";