黑马程序员技术交流社区

标题: 参数传递问题 [打印本页]

作者: 袁錦泰    时间: 2012-7-22 22:20
标题: 参数传递问题
  1. public class People {
  2.         int age = 20;

  3.         public void change(People people) {
  4.                 people = new People();

  5.                 people.age = 30;
  6.         }

  7.         public static void main(String[] args) {
  8.                 People people = new People();

  9.                 int age = people.age;

  10.                 System.out.println(age);

  11.                 people.change(people);

  12.                 int age2 = people.age;

  13.                 System.out.println(age2);
  14.         }

  15. }
复制代码
请提交代码结果及分析过程...
作者: 黑马振鹏    时间: 2012-7-22 22:34
public class People {
    int age = 20;
    public void change(People people) {
            people = new People();

            people.age = 30;
            System.out.println("chang()"+people.age);    }
    public static void main(String[] args) {
            People people = new People();
            int age = people.age;
            System.out.println(age+"---");
            people.change(people);
            int age2 = people.age;
            System.out.println(age2+"++");
    }

增加一行代码:
打印结果:
20---
chang(): 30
20++


int age = people.age;System.out.println(age);
nt age2 = people.age;System.out.println(age2);
这两行代码是一样的。都是打印定义的变量20.

版主出这个题啥意思 呵呵





}


作者: 袁錦泰    时间: 2012-7-22 22:49
黑马振鹏 发表于 2012-7-22 22:34
public class People {
    int age = 20;
    public void change(People people) {

我是来听听大伙的分析,今天同学问我的问题.
我告诉他结果,他说不对,最终说我的答案是对的,是他看错了,但是我被他搅糊涂了.到来这矫正一下...
作者: 李菁    时间: 2012-7-22 22:50
两个结果都是20。
第一次输出的age没有调用change方法,所以结果没20
第二次输出的age虽然调用了change方法,但 people.age=30没有覆盖成员变量age的值,所以结果还是20
作者: 袁錦泰    时间: 2012-7-22 22:51
袁錦泰 发表于 2012-7-22 22:49
我是来听听大伙的分析,今天同学问我的问题.
我告诉他结果,他说不对,最终说我的答案是对的,是他看错了,但 ...

这个涉及到引用的指向问题,你可以再说的透彻一些,看来你对这个思路狠清晰,我很久没有复习之前的原理,有些概念已经模糊了,禁不住仔细推敲,请你来帮忙分析一下...
作者: 袁錦泰    时间: 2012-7-22 22:55
李菁 发表于 2012-7-22 22:50
两个结果都是20。
第一次输出的age没有调用change方法,所以结果没20
第二次输出的age虽然调用了change方法 ...

你的意思是我在change方法内部写一个int age = 30;这样结果就是20 30了?
作者: 艾衍年    时间: 2012-7-22 23:02
C:\Users\ai\Desktop\1.jpg
有图有说明,希望可以说明问题{:soso_e100:}
C:\Users\ai\Desktop\people.jpg
作者: 艾衍年    时间: 2012-7-22 23:03
怎么把图片发上去啊
作者: 艾衍年    时间: 2012-7-22 23:05
汗。。。
作者: 袁錦泰    时间: 2012-7-22 23:09
艾衍年 发表于 2012-7-22 23:05
汗。。。

回答得不错,这一期版主看到的话应该会加分给你的... 加油!
作者: --☆伟☆--    时间: 2012-7-22 23:09
打印结果是:
20
20
——————————
而不是20和30
原因在于题中
public void change(People people) {
             people = new People();
              people.age = 30;

方法中传进去的people对象已经被重新赋值为一个新的People对象,所以里面的30是赋值给了一个新的对象,而那个新的对象也叫做People,所以造成误导,此时在方法内部打印People的age变量就是30了
把代码改变一下
public class People {         
                int age = 20;
       public People change(People people) {
                                 people = new People();
                   people.age = 30;
                   return people;         
               }
         
               public static void main(String[] args) {         
                       People people = new People();         
                     int age = people.age;
                     System.out.println(age);                             
                      people= people.change(people);                      
                        int age2 = people.age;         
                      System.out.println(age2);         
               }
        }
此时在运行结果就是20和30
作者: 廖超超    时间: 2012-7-22 23:19
public class People {
        int age = 20;
        public void change(People people) {
                people = new People();//5. 5.1:people局部变量接受主函数传递过来的对象。5.2:new People是建立一个新对象把地址值赋给people,people现在的对象引用是这个方法里面新建的对象。和主函数所创建的对象没有关系
                people.age = 30;//6.修改新对象的age。以前对象的age没有关系
        }
        public static void main(String[] args) {
                People people = new People();//1.创建一个对象,对象进行初始化
                int age = people.age;//2.调用people对象的成员变量age值赋值给main函数局部变量age
                System.out.println(age);//3.打印main函数变量age值 输出“  20  ”
                people.change(people)//4.调用people对象的方法change,传递一个对象
                int age2 = people.age;//7.调用people对象的成员变量age值赋值给main函数局部变量age,他的age值没有改变过
                System.out.println(age2);//打印age值:“  20 ”
        }
}
输出结果:
                   20
                   20

作者: 艾衍年    时间: 2012-7-22 23:19
袁錦泰 发表于 2012-7-22 23:09
回答得不错,这一期版主看到的话应该会加分给你的... 加油!

嘿嘿 加油加油
作者: 袁錦泰    时间: 2012-7-23 00:16
liaochao 发表于 2012-7-22 23:19
public class People {
        int age = 20;
        public void change(People people) {

小伙儿 我問你一个问题 这么多人就你提到了传递这个词 你觉得这个参数传递的是引用吗?
作者: 于星星    时间: 2012-7-23 00:47
  1. public class People {
  2.        [color=Red] int age = 20;[/color]      
  3. public void change(People people) {
  4.                 people = new People();

  5.                 people.age = 30;
  6.         }

  7.         public static void main(String[] args) {
  8.              [color=Red]   People people = new People();

  9.                 int age = people.age;

  10.                 System.out.println(age);[/color]         

  11.                [color=Yellow]people.change(people);[/color]                int age2 = people.age;

  12.                 System.out.println(age2);
  13.         }

  14. }
复制代码
这个题初看起来那个change函数起了作用其实它操作的是两个对象,在第一次打印age的时候,是20这个不用多说,那是肯定的,但是第二次在调用change函数之后还是20,而在change函数之中虽然改变了change的值,按照常理说应该是改变之后的值为30,但是其中有一个new pelple对象的步骤,虽然在change方法中将main中的people的对象通过参数传过去了,但是在change函数中又new了一个新的people对象,将穿过来的people指向了别的对象,在内存中又重新创建了一个新的age值。所以现在在change函数中对象都不是一样,所以即使改变了也不是改变的main方法中的那个people对象的age值。如果想改变age的值,只需要把people中的new people对象去掉就可以。
作者: 朱云坤    时间: 2012-7-23 03:51
  1. public class People {
  2.         int age = 20;

  3.         public void change(People people) {
  4.                 people = new People();//people指向了另一个People的对象

  5.                 people.age = 30;
  6.         }

  7.         public static void main(String[] args) {
  8.                 People people = new People();//声明了一个People类型的变量people指向People的对象

  9.                 int age = people.age;

  10.                 System.out.println(age);

  11.                 people.change(people);//people是一个引用变量

  12.                 int age2 = people.age;

  13.                 System.out.println(age2);
  14.         }

  15. }
复制代码

作者: 廖超超    时间: 2012-7-23 18:33
本帖最后由 liaochao 于 2012-7-23 18:37 编辑
袁錦泰 发表于 2012-7-23 00:16
小伙儿 我問你一个问题 这么多人就你提到了传递这个词 你觉得这个参数传递的是引用吗? ...


传递的是对象在堆内存中的地址值。用赋值更好点
基本数据类型传递的是这个变量的具体值
引用数据类型传递的是地址值
作者: 王宝康    时间: 2012-7-23 18:49
  1. package cn.study.parameter;

  2. public class People {
  3.        
  4.         int age = 20;

  5.         public void change(People people) {
  6.                 people = new People();
  7.                 //通过这儿的输出语句,你可以发现,当前对象和传入的对象根本不是同一个,你在chang()方法内又新创建了一个对象,里边只是给新建的对象赋值为30
  8.             System.out.println(this.toString()+"......."+people.toString());
  9.             people.age = 30;
  10.         }

  11.         public static void main(String[] args) {
  12.                 People people = new People();

  13.                 int age = people.age;

  14.                 System.out.println(age);

  15.                 people.change(people);

  16.                 int age2 = people.age;

  17.                 System.out.println(age2);
  18.         }
  19.         
  20.    }
复制代码

作者: 张頔    时间: 2012-7-23 21:38
public class People {
        int age = 20;

        public void change(People people) {
                people = new People();//这个地方新new了一个People 而且并没有返回值,相当于成员变量和局部变量。把这句删了即可                people.age = 30;         
        }

        public static void main(String[] args) {
                People people = new People();//
                int age = people.age;

                System.out.println(age);

                people.change(people);

                int age2 = people.age;

                System.out.println(age2);
        }

}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2