A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戴乾刚 中级黑马   /  2013-3-13 17:24  /  1308 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戴乾刚 于 2013-3-13 20:17 编辑
  1. package heima.com;

  2. public class ChangeDemo {

  3.     /**
  4.      * @param args
  5.      */
  6.     public static void main(String[] args) {
  7.         // TODO Auto-generated method stub
  8.         Person p1 = new Person("张三",32);
  9.         Person p2 = new Person("李四",33);
  10.         System.out.println(p1.getName()+p1.getAge());
  11.         System.out.println(p2.getName()+p2.getAge());
  12.         System.out.println(p1);
  13.         
  14.         /*Person temp = p1;
  15.         p1 = p2;
  16.         p2 = temp;*/
  17.         swap(p1,p2); //这两种交换方式有什么区别?
  18.         
  19.         System.out.println(p1.getName()+p1.getAge());
  20.         System.out.println(p2.getName()+p2.getAge());
  21.         System.out.println(p1);
  22.     }
  23.     public static void swap(Person p1,Person p2){
  24.         Person temp = p1;
  25.         p1 = p2;
  26.         p2 = temp;
  27.     }
  28. }

  29. class Person{
  30.     private String name;
  31.     private int age;
  32.     public Person(String name, int age) {
  33.         super();
  34.         this.name = name;
  35.         this.age = age;
  36.     }
  37.     public String getName(){
  38.         return name;
  39.     }
  40.     public int getAge(){
  41.         return age;
  42.     }
  43. }直接在主函数中交换和调用swap()方法为什么结果不同
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

2 个回复

倒序浏览
因为后来想明白了,把我的理解说下吧:

后来想明白的:定义方法是将栈内存中的变量p1、p2的值,也就是两个对象的内存地址值传递给方法作为实参,而方法区中的变量p1、p2接收参数之后把值进行了交换,改变的是方法区中的p1、p2所指向的对象,但是栈内存中的那两个变量的值并没有改变; 而直接在主函数中进行交换是改变栈内存中的变量p1、p2所指向的对象,所以两种方式结果不一样
回复 使用道具 举报
戴乾刚 发表于 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所指对象进行的交换,所以打印的值不同。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马