java笔记--上水课时复习用(A)(24)
2023-08-19 来源:百合文库
=========
| 地址201 |
| id 100 |
| 张七 |-------->u1新建地址为201的对象(100,张七),u1 传入test方法;
| u1 | 这时候u1和u都指向地址201,u把name改为张八了。局部变量u执行完
| | 就没了,那么u1的name就是张八了。 u1(指向201)传入test01方法,
| | test01方法中新建一个对象u,地址假设为202(id200,张三)
|========| 然后赋给u。u指向202内存,与u1没关系了。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
例子2:来源《https://mp.weixin.qq.com/s/Iq6C56_H6CThR5w6v_sQ7Q》
public static void main(String[] args) {
String x = new String("沉默王二");
change(x);
System.out.println(x);
}
public static void change(String x) {
x = "沉默王三";
}
/*从代码的字面逻辑来看,程序应该输出“沉默王三”,但事与愿违,程序输出的结果却是“沉默王二”。change() 方法做的是无用功,因为 String 是值传递而不是引用传递
x 存储的是一个引用,该引用指向内存中的“沉默王二”字符串对象。当我们把 x 作为参数传递给 change() 方法时,x 仍然指向的是内存中“沉默王二”字符串,当字符串“沉默王二”被创建的时候,Java 会在内存中申请一小段空间,用来存储这个字符串对象。然后呢,把对象的引用指向了变量 x,也就是说,变量 x 实际上存储的是对象的引用(对象在内存中存储的地址)。
关键的点来了。当变量 x 作为参数(实参)传递给 change() 方法时,实际上传递的是 x 的一个拷贝(形参)。在 change() 方法中,形参 x 起先引用的也是“沉默王二”这个对象,当执行 x = "沉默王三" 的时候,会在内存中创建新的字符串“沉默王三”,然后形参 x 不再引用“沉默王二”这个对象了,改为引用“沉默王三”这个对象了。*/
| 地址201 |
| id 100 |
| 张七 |-------->u1新建地址为201的对象(100,张七),u1 传入test方法;
| u1 | 这时候u1和u都指向地址201,u把name改为张八了。局部变量u执行完
| | 就没了,那么u1的name就是张八了。 u1(指向201)传入test01方法,
| | test01方法中新建一个对象u,地址假设为202(id200,张三)
|========| 然后赋给u。u指向202内存,与u1没关系了。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
例子2:来源《https://mp.weixin.qq.com/s/Iq6C56_H6CThR5w6v_sQ7Q》
public static void main(String[] args) {
String x = new String("沉默王二");
change(x);
System.out.println(x);
}
public static void change(String x) {
x = "沉默王三";
}
/*从代码的字面逻辑来看,程序应该输出“沉默王三”,但事与愿违,程序输出的结果却是“沉默王二”。change() 方法做的是无用功,因为 String 是值传递而不是引用传递
x 存储的是一个引用,该引用指向内存中的“沉默王二”字符串对象。当我们把 x 作为参数传递给 change() 方法时,x 仍然指向的是内存中“沉默王二”字符串,当字符串“沉默王二”被创建的时候,Java 会在内存中申请一小段空间,用来存储这个字符串对象。然后呢,把对象的引用指向了变量 x,也就是说,变量 x 实际上存储的是对象的引用(对象在内存中存储的地址)。
关键的点来了。当变量 x 作为参数(实参)传递给 change() 方法时,实际上传递的是 x 的一个拷贝(形参)。在 change() 方法中,形参 x 起先引用的也是“沉默王二”这个对象,当执行 x = "沉默王三" 的时候,会在内存中创建新的字符串“沉默王三”,然后形参 x 不再引用“沉默王二”这个对象了,改为引用“沉默王三”这个对象了。*/