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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 坚强 黑马帝   /  2011-11-9 22:54  /  2650 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  我在书上看到函数参数的传入有两种:按值传递和引用调用。按值传递稍稍能理解,但是引用调用很不理解,求帮助,求解释!
这是按值传递程序:

引用调用程序

运行 结果:


顺序没有弄好,请见谅!

未命名1.jpg (28.6 KB, 下载次数: 8)

未命名1.jpg

未命名2.jpg (34.65 KB, 下载次数: 9)

未命名2.jpg

未命名3.jpg (18.54 KB, 下载次数: 8)

未命名3.jpg

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

8 个回复

倒序浏览
第三张图是按值传递   第二张是引用调用   第一张是两个的结果
回复 使用道具 举报
你这样记:按值传递是传递一个复制的值过去,他有两份,改变了一个不影响另一个。
按引用传递,是指向性的,他们同时指向了一个值。相当于共享,无论谁改变了其值,都会影响到另一个。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
第二个图是引用传递,因为15、20是new出 的实例对象的变量存储于堆中,而op则在栈内存中,传值的时候,是引用调用地址来获取这变量值并赋值的。
第三个图是值传递,两个变量值都在栈内存中,op也在栈内存中,是直接赋值过去的,是值传递!

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
引用传递说白了就是   有两个名字,它们指向同一个对象。若对象被处理已改变,我们再去用对象,只能用改变的对象。
值传递就是把你的值复制给我一份,我再去处理我复制得到的这份相同数据。我处理后值改变了,但是你的值不会改变。

评分

参与人数 1技术分 +1 收起 理由
宁超 + 1 赞一个!

查看全部评分

回复 使用道具 举报
ob.a,ob.b其实就是ob变量指向了堆内存中的a,b值,不管是main方法还是meth方法,它们中的引用变量都是指向堆内存中相同的对象,如果在meth方法中改变了a,b的值那么main方法中的ob.a,ob.b也会发生相应的改变;

评分

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

查看全部评分

回复 使用道具 举报
坚强 黑马帝 2011-11-10 08:39:36
7#
肖瑞军 发表于 2011-11-9 23:20
引用传递说白了就是   有两个名字,它们指向同一个对象。若对象被处理已改变,我们再去用对象,只能用改变 ...

  你和海林的话结合起来,让我茅塞顿开,我也知道了,现下缺乏练习,  我该如何判断是值传递还是引用传递?
回复 使用道具 举报
史晓霞 黑马帝 2011-11-10 09:07:02
8#
未命名2.jpg是引用类型是按照引用调用的,引用一般包括String类型和对象类型,它们存储到椎中,它是多个变量指向一个引用地址。而未命名1.jpg是基本类型是按照值传递的包括基本8个数据类型,它们存在栈中,它是有各自内存,谁也不会影响谁的值
回复 使用道具 举报
(转)我觉得这篇blog写的很好,我们不要咬文嚼字的去转牛角尖去判断是值传递还是引用传递,是值传递还是引用传递并不重要,重要的是要理解“对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。”
原文地址:http://yangwn.iteye.com/blog/379692

当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

用google查询结果,得到答案基本上是:值传递。当时觉得挺纳闷儿,为什么连参数的内容都被修改了,怎么还能说是“值传递”呢?因为在传统的印象里(尤其是从C++过来以后),值传递都应该是不改变原参数的。

问问周围的同事,也大都这么讲,但是也都讲不清这种理论的根源是什么。我这个人有个毛病,有事情想不通时就会憋得难受,后来在《Thinking in Java》的一段内容(注解[1])里找到了自己的结论,我认为(《Thinking in Java》的作者也这么认为):可以说是值传递,也可以说是引用传递。

一,认为是值传递。得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容”,这句话可能有些费解,举个例子加以说明。

public class Paier {

     public static void main(String[] args) {

                    Paier paier = new Paier();

                    paier.test();

     }

     

     public void test() {

                    TestClass para1 = new TestClass();

                    para1.setTest(new Integer(10));

                    TestClass result1 = test1(para1);

                    System.out.println("para1   = " + para1.getTest());

                    System.out.println("result1 = " + result1.getTest());

                    

                    TestClass para2 = new TestClass();

                    para2.setTest(new Integer(10));

                    TestClass result2 = test2(para2);

                    System.out.println("para2   = " + para2.getTest());

                    System.out.println("result2 = " + result2.getTest());

     }

     

     public TestClass test1(TestClass t) {

                    t = new TestClass();

                    t.setTest(new Integer(20));

                    return t;

     }

     

     public TestClass test2(TestClass t) {

                    t.setTest(new Integer(20));

                    return t;

     }

     

     class TestClass {

                    Integer test = null;

                    public void setTest(Integer i) {

                                  test = i;

                    }

                    public Integer getTest() {

                                  return test;

                    }

     }

}

执行后的结果是:

para1   = 10

result1 = 20

para2   = 20

result2 = 20

为什么会这样呢?因为test1想通过修改参数的引用来修改返回值,但是在JAVA中,参数的引用是不可修改的,所以para1和result1分别指向不同的空间,结果也不一样。而在test2中,result2和para2始终指向同一块区域,test2方法修改的是参数内容,而不是参数的引用。

从上面看来,因为参数的引用不可改变,如果理解为“参数的值就是对该对象的引用”,那么java自然只有值传递。

二,认为是引用传递。还是上面的例子,如果在参数传递时理解为“参数的值就是该对象的内容”,那么显然不是值传递,因为对象的内容已经改变了。

认为是引用传递还有一个理由,就是java有一个保留字byvalue,现在的JDK版本中还没有实现这个保留字,似乎是在暗示对这种观点的支持。(There appears to be some support for this view within Sun, since one of the “reserved but not implemented” keywords is byvalue.)

所以说,对于原题的结论,是值传递还是引用传递并不重要,重要的是要理解“对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。”

评分

参与人数 1技术分 +1 收起 理由
杨玉揆 + 1

查看全部评分

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