Stack Overflow中的相似问题的答案说的很清楚
希望能帮到题主
所有基本类型包装类有以下两个特点:
1. 所有实例都是只读的
2. 用基本类型进行赋值时,会自动新建实例。
翻译如下:(可以使用String类比是因为虽然String不是包装类,但是有包装类的特性,final修饰不可更改,自动装箱拆箱,可以帮助理解包装类)
String str = new String();
str 不是一个对象,是对象的引用,"Hello"和"Help!"是两个字符串对象,因此 str 指向一个字符串对象,你可以改变str指向哪个对象,但是不可以他指向的对象的内容
String s1 = "Hello";
String s2 = s1;
// s1 and s2 now point at the same string - "Hello"
现在s1和s2指向了相同的字符串 "Hello",但是"Hello"这个字符串对象本身是不可更改的所以我么无法修改它
如果我们这么做
s1 = "Help!";
System.out.println(s2); // still prints "Hello"
这样我们可以看到直接修改对象和改变引用的区别,s2仍然指向 "Hello" ,设置s1 = "Help!";的过程中实际上是,重新创建了一个字符串对象"Help!",然后让s1指向"Help!",我们只是改变了s1的指向,并没有修改"Hello"对象,"Hello"仍然是不可更改的。
妙!!!!!