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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//引用数据类型参数传递
class Demo
{
        int x = 3;
        public static void main(String[] args)
        {
                Demo d = new Demo();
                d.x = 9;
                show(d);
                System.out.println(d.x);
        }
        public static void show(Demo d)
        {
                d.x = 4;
        }
}
--------------基础视频里面这段看起来有点绕,不太明白这个传递过程和结果,有谁帮解答一下么? 谢谢

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

9 个回复

倒序浏览
应该显示9,因为main和show两个方法里面数据时局部变量,在main只能怪输出的局部数据应该以main中看
回复 使用道具 举报
显示是4,看来我理解错了
回复 使用道具 举报
应该是4
这里方法的d是对象,传递的是对象的引用值,也就是这里的参数d和你建立的对象d有相同的引用值,也就是说在方法中引用的对象和传递的对象是一样的。所以你改变参数d的属性也就是改变对象d的属性。
回复 使用道具 举报
这个貌似没有什么比较绕的地方啊,一切都是行云流水一般。。。
类中定义一个成员变量,创建出一个实例,这个x变量在实例创建的时候就跟这个实例绑定在一起了,
后面不管怎么变,变的都是这个实例变量Demo d中的x。

如果在后面重新创建一个对象Demo d1,那么d1.x还是等于3的。
回复 使用道具 举报
show方法中的d  可以任意换个名称!!!可以利于理解
详见如下注释

  1. class Demo
  2. {
  3.         int x = 3;
  4.         public static void main(String[] args)
  5.         {
  6.                 Demo d = new Demo();  //新建一个对象 d 并且d对象中有个变量x  初始化为0
  7.                 d.x = 9;    // 把9赋值给d对象的x
  8.                 show(d);//调用show方法
  9.                 System.out.println(d.x);//打印d对象的x值
  10.         }
  11.         public static void show(Demo d) //show方法
  12.         {
  13.                 d.x = 4; //传入哪个对象,就把4赋值给哪个对象的x值  这里可以随便换变量名称,不一定要写d
  14.         }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
Demo d = new Demo();
d就是一个操纵demo对象的遥控器,当你将d的值传递给了形参d,形参d的值就与d的值相等了,由于形参d是一个引用,它也可以去操纵demo对象,所以说他们操纵的是同一个对象啊。

形参d是一个引用,没有实际的指向对象,直到被调用赋值。

如果形参是primitive类型,比如int类型,那么就会有一个局部变量产生。
传递参数的时候,都会产生一个局部变量,只不过你可以通过引用变量来操作你赋值的对象。
如果你了解C的话,你可以把引用看作指针。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 行如止水 于 2014-3-2 18:04 编辑

这个结果明显是4;
创建了一个自己的对象后,d一直是指向堆中的内容;
然后d.x = 9;将将自己的x赋值成9;
show()方法,传入d,但是在方法中的d与传入的d在栈中是不同的,但是指向一个堆对象;
在方法内调用d.x = 4;则使对象中的x变成4;
最后输出当然就是4了。很详细吧

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
结果是4

无标题.png (60.18 KB, 下载次数: 17)

无标题.png
回复 使用道具 举报
这个按照代码的顺序来看:
int x = 3;
        public static void main(String[] args)
        {
                Demo d = new Demo(); 在堆内存里开辟了一个Demo的空间
                d.x = 9;将自己的x赋值为9
                show(d);调用show的功能,并将Demo d传给show,show指向了d,并给d的x赋了个4的值
                System.out.println(d.x);此时打印的是功能show里面的x值,所以结果是4
        }
        public static void show(Demo d)
        {
                d.x = 4;
        }

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

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