黑马程序员技术交流社区

标题: 你还在认为对象是“引用传递”吗? [打印本页]

作者: 王杰    时间: 2012-3-8 10:19
标题: 你还在认为对象是“引用传递”吗?
本帖最后由 苳眠 于 2012-3-8 10:20 编辑

    有些人说对象是“按引用”传递的,这是不正确的。在编程语言设计中,术语“引用传递”(pass by reference)真正的含义是引元传递给函数时,被调用的函数获得的是对原值的引用,而非原值的副本。如果函数修改了其参数,那么调用代码中的值也将发生改变,这是因为引元和参数使用了内存中的同一块地址。……java语言并不按引用来传递对象,而是值传递对象。因为同一个引用的两份副本指向的都是同一个实际对象,所以通过一个引用变量所做的修改可以被另一个引用观察到。准确地讲,java只有一种参数传递方式,即值传递,这么做有助于保持简单。———————《The Java Programming Language》(Fourth Edition) Author : Ken Arnold , James Gosling , David Holmes

今天看书的时候发现的,我原来的时候一直认为对象是引用传递。现在通过以上的讲解才明白,其实我们不能因为对象是一种引用数据类型而说对象是引用传递!术语中的引用传递可不是这样的意思。
我们在一个函数中如果传入的参数是一个对象的话,其实,我们传入的是某个对象在堆内存中的地址值!对象在储存时,是在栈内存中有一个引用类型的声明,在堆内存中有对象的实例,声明的引用类型指向堆内存中的对象实例。我们在传递的时候是值传递!传递的是声明引用类型,而声明的引用类型就是一个地址值!
    你过去是不是也有过这样的误解呀。现在明白了吧!

该贴已经同步到 苳眠的微博
作者: 吴璞玉    时间: 2012-3-8 10:49
帮顶,学习了
作者: 张锐    时间: 2012-3-8 11:09
是这么回事,传送门 http://bbs.itheima.com/forum.php ... amp;page=1#pid43434

相当于你传递的是地址的副本,如果单纯的把副本改变了,地址原址是没有变的,但因为地址的副本和原本指向的内容是一样的,所以改变副本指向的内容,原本指向的内容也会跟着改变。




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