黑马程序员技术交流社区

标题: 引用数据类型的传递 [打印本页]

作者: 王德云    时间: 2011-11-8 19:28
标题: 引用数据类型的传递
Java中使用引用来取代c++中的指针,那么什么是引用?Java又是怎样通过引用来取代C++中指针呢?请高手赐教!!!
作者: 柴永菲    时间: 2011-11-8 20:17
JAVA里很重要的"引用"的概念的意思是:其值为地址的数据元素.Java对对象和基本的数据类型的处理是不一样的。和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,这种方式的参数传递被称为"值传递",怎么操作都不会改变原参数。而在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。
希望能帮到你
作者: qy    时间: 2011-11-8 20:21
java 中的引用数据类型传递 就是将该变量或变量的值的地址引用到你调用的地方,当原地方的变量值发生改变时,你引用时 系统就会根据引用时的路径找到改变后的值,传到你引用后的地方;至于Java中的引用和c++中的指着 应该就是不同方向下定义的不同语言,其原理并没什么不同。
作者: 郝亚平    时间: 2011-11-8 20:25
JAVA中引用传递,很强大呀。就像C++中指针一样。不过,更加安全点。自己也很想清楚JAVA与C++的差别。关于JAVA引用,大概就是这样子的:
如果你在方法中把对象(或数组)作为参数,在方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。因为是直接针对于地址的操作,故而,就会有这个结果啦:在调用结束后被保留了下来啦。。。:)
作者: 杨玉揆    时间: 2011-11-8 20:26
    指针-对于一个类型T,T*就是指向T的指针类型,也即一个T*类型的变量能够保存一个T对象的地址,而类型T是可以加一些限定词的,如const、volatile等等。见下图,所示指针的含义:

    引用-引用是一个对象的别名,主要用于函数参数和返回值类型,符号X&表示X类型的引用。见下图,所示引用的含义:

指针和引用的区别

    首先,引用不可以为空,但指针可以为空。前面也说过了引用是对象的别名,引用为空——对象都不存在,怎么可能有别名!故定义一个引用的时候,必须初始化。因此如果你有一个变量是用于指向另一个对象,但是它可能为空,这时你应该使用指针;如果变量总是指向一个对象,i.e.,你的设计不允许变量为空,这时你应该使用引用。如下图中,如果定义一个引用变量,不初始化的话连编译都通不过(编译时错误):

    而声明指针是可以不指向任何对象,也正是因为这个原因,使用指针之前必须做判空操作,而引用就不必。
    其次,引用不可以改变指向,对一个对象"至死不渝";但是指针可以改变指向,而指向其它对象。说明:虽然引用不可以改变指向,但是可以改变初始化对象的内容。例如就++操作而言,对引用的操作直接反应到所指向的对象,而不是改变指向;而对指针的操作,会使指针指向下一个对象,而不是改变所指对象的内容。

引用比指针更安全。由于不存在空引用,并且引用一旦被初始化为指向一个对象,它就不能被改变为另一个对象的引用,因此引用很安全。对于指针来说,它可以随时指向别的对象,并且可以不被初始化,或为NULL,所以不安全。const 指针虽然不能改变指向,但仍然存在空指针,并且有可能产生野指针(即多个指针指向一块内存,free掉一个指针之后,别的指针就成了野指针)。
网上 找到的希望对你有帮助
作者: 郝亚平    时间: 2011-11-8 20:35
霞光满树 发表于 2011-11-8 20:25
JAVA中引用传递,很强大呀。就像C++中指针一样。不过,更加安全点。自己也很想清楚JAVA与C++的差别。关于JA ...

我还有个问题,不知道你知道不。。
C++中的除法运算符/,当两个参数中1个是double型,1个时int型时,结果就是double啦。
而当两个参数都是int时,结果就是int类型啦。这个是C++中的重载操作符机制。C++允许重载操作符。

JAVA中除法运算符/也是这样子的运算规律,而JAVA是不允许运算符重载的,那么,其内部实现是什么,是自动类型转换吗?与重载特性无关?
作者: 喻尚健    时间: 2011-11-8 21:13
堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或者对象起的一个名称。
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是Java 比较占内存的原因。
实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!




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