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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冯鹏飞 黑马帝   /  2011-7-28 07:02  /  2882 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当一个对象作为参数传去方法时,该方法可以将对象的成员变量进行改变,那么该对象的传递是值传递还是引用传递?想不明白的是怎么会是值传递?希望能分析其中传递的原理,先谢谢了. 

3 个回复

倒序浏览
java中方法参数的传递不管是引用类型还是原生类型,都是值传递
Demo:[code=java]Piont类
package com.cast.heima;

public class ;P oint {

        int x = 0;

        int y = 0;
}
运行类
package com.cast.heima;

public class ;P aramProblem {

        public static void main(String[] args) {
                Point point = new Point();
                System.out.println("x:"+point.x+",y:"+point.y);//打印x:0,y:0
                ParamProblem paramProblem = new ParamProblem();
                //此处传递是实参
                paramProblem.changePoint(point);
                System.out.println("x:"+point.x+",y:"+point.y);//打印x:3,y:4
        }
        //此处传递是形参
        public void changePoint(Point point) {
                point.x = 3;
                point.y = 4;
        }
}[/code]
[ 本帖最后由 杨志罡 于 2011-07-29  00:01 编辑 ]
回复 使用道具 举报
去看看,这个帖子吧:《方法调用》9 楼。
回复 使用道具 举报
我们用程序和画图展示引用类型的参数传递---值传递[code=java]package cn.itcast.heima
public class TestReferenceTransfer
{
        public static void swap(DataWrap dw)
        {
                //下面三行代码实现dw的a、b属性值交换。
                //定义一个临时变量来保存dw对象的a属性的值
                int tmp = dw.a;
                //把dw对象的b属性值赋给a属性
                dw.a = dw.b;
                //把临时变量tmp的值赋给dw对象的a属性
                dw.b = tmp;
                System.out.println("swap方法里,a属性的值是" + dw.a + ";b的值是" + dw.b);
                //把dw直接赋为null,让它不再指向任何有效地址。
                dw = null;
        }
        public static void main(String[] args)
        {
                DataWrap dw = new DataWrap();
                dw.a = 6;
                dw.b = 9;
                swap(dw);
                System.out.println("交换结束后,a属性的值是" + dw.a + ";b属性的值是" + dw.b);

        }
}[/code]其中的DataWap类为:[code=java]public class DataWap
{
      public int a ;
      public int b ;
}[/code]执行上面的程序可以看到:[code=java]swap方法里,a属性的值是9;b的值是6
交换结束后,a属性的值是9;b属性的值是6[/code]它的传递机制还是值传递,因为传过去的是一个引用

1、程序从main方法开始执行,创建一个对象的时候,系统内存中有两个实体,堆内存保存了对象本身,栈内存保存了该对象的引用,接着程序操作DataWap对象,把这个对象的a,b属性赋值,如下图所示:


2、接下来main方法开始调用swap方法,main方法饼没有结束,系统会分别开除main和swap两个栈区,分别存放main和swap的局部变量,调用swap方法时候,dw作为实参传入swap方法,才有值传递的方式,:把main方法的dw变量的值传递给swap方法的dw形参,从而完成了swap方法dw形参的初始化,main方法的dw是一个引用,保存的是时机对象的地址,当把dw的值赋给swap方法的dw形参的时候,就是让dw形参也保存这个地址值,也就是引用到堆内存中的DataWap对象 ,如下所示:


3、从上面可以看出这种传递也是一种值传递,但是关键是在于dw是一个引用变量,所以系统复制了dw变量,兵没有复制DataWap对象,
当城西在swap方法里面操作dw的时候,由于dw只是一个引用变量故世纪操作的还是堆内存里面的DataWap对象,这个时候不管是操作main放的dw变量,还是swap方法的dw变量,都是操作他们引用到的DataWap对象,都是同一个对象,那么swap里面的交换dw参数的引用DataWap对象的a、b的属性,也就看到main方法的属性同样被改变,

4、这个时候我们可以把dw直接赋值为null,让他不在指向任何的有效地址,如下所示:
[code=java]//把dw直接赋为null,让它不再指向任何有效地址。
dw = null;[/code]5、这个时候swap方法失去了DataWap的引用,不可再访问堆内存中的DataWap对象,但是main方法可以不受影响,一人引用DataWap对象,所以可以看到上面程序输出的结果;

具体可参考这个帖子
http://bbs.itheima.com/thread-607-1-1.html
[ 本帖最后由 詹季春 于 2011-07-28  11:07 编辑 ]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马