黑马程序员技术交流社区
标题:
引用类型作为参数的问题
[打印本页]
作者:
戴乾刚
时间:
2013-3-13 17:24
标题:
引用类型作为参数的问题
本帖最后由 戴乾刚 于 2013-3-13 20:17 编辑
package heima.com;
public class ChangeDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Person p1 = new Person("张三",32);
Person p2 = new Person("李四",33);
System.out.println(p1.getName()+p1.getAge());
System.out.println(p2.getName()+p2.getAge());
System.out.println(p1);
/*Person temp = p1;
p1 = p2;
p2 = temp;*/
swap(p1,p2); //这两种交换方式有什么区别?
System.out.println(p1.getName()+p1.getAge());
System.out.println(p2.getName()+p2.getAge());
System.out.println(p1);
}
public static void swap(Person p1,Person p2){
Person temp = p1;
p1 = p2;
p2 = temp;
}
}
class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}直接在主函数中交换和调用swap()方法为什么结果不同
复制代码
作者:
戴乾刚
时间:
2013-3-13 20:19
因为后来想明白了,把我的理解说下吧:
后来想明白的:定义方法是将栈内存中的变量p1、p2的值,也就是两个对象的内存地址值传递给方法作为实参,而方法区中的变量p1、p2接收参数之后把值进行了交换,改变的是方法区中的p1、p2所指向的对象,但是栈内存中的那两个变量的值并没有改变; 而直接在主函数中进行交换是改变栈内存中的变量p1、p2所指向的对象,所以两种方式结果不一样
作者:
沉默de羔羊
时间:
2013-3-14 11:03
戴乾刚 发表于 2013-3-13 20:19
因为后来想明白了,把我的理解说下吧:
后来想明白的:定义方法是将栈内存中的变量p1、p2的值,也就是两个 ...
昨天根据你说的,我思考了好久,最终被我实践打败了。
我修改你的方法如下:
public static void swap(Person p3,Person p4){
// Person temp = p3;
p3 = p4=p3;
// p4 = temp;
}
但是打印的结果还是一样的。
就推翻了我理解的:可以理解成对象交换了呃,但是指向并没有变换
无奈想了很久,结合你和朋友的思想,我归纳了如下解释:
其实可以理解成,p1对象赋值给方法体参数p3,然后操作的是参数p3,但是p3指向的内存区域还是p1,交换了p3和p4的指向对象,但是没有改变p1和p2,但是要是修改了p3或p4的内容,那么对于指向内存区域的p1或p2的来说,也就是修改了p1和p2的内容!
在mian函数中直接进行了p1和p2所指对象进行的交换,所以打印的值不同。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2