黑马程序员技术交流社区

标题: JAVA中引用和指针是不是一样的? [打印本页]

作者: 王鹏伟    时间: 2013-2-23 14:45
标题: JAVA中引用和指针是不是一样的?
JAVA中引用和指针是不是一样的?

作者: 李挺    时间: 2013-2-23 14:51
指针可以运算,貌似引用就不行
而且指针很难懂,*啊&啊什么的

作者: 陈圳    时间: 2013-2-23 14:53
指针是C++的,java没有指针,不一样的.java中的引用变量只是对象/数组/接口,而基本类型是没有的.
指针是C++的,可以把基本类型的地址值赋给指针变量,java中没有.

作者: 黑马-张洋    时间: 2013-2-23 14:58
1.类型:引用其值为地址的数据元素,java封装了的地址,可以转成字符串查看,长度可以不必关心。C++指针是一个装地址的变量,长度一般是计算机字长,可以认为是个int。
2.所占内存: 引用声明时没有实体,不占空间。C++指针如果声明后会用到才会赋值,如果用不到不会分配内存。
3.类型转换:引用的类型转换,也可能不成功,抛异,或者IDE就不能通过。C++指针只是个内存地址,指向那里,对程序来说还都是一个地址,但可能所指的地址不是程序想要的!
4.初始值:引用初始值为java关键字null。C++指针是INT,如不初始化指针,那他的值就不是固定的了。
5.计算:引用是不可以计算的。C++指针是INT,所以他可以计算,所以经常用指针来代替数组下标。
6.控制:引用不可以计算,所以他只能在自己程序里,可以被控制。C++指针是内存地址,也可以计算,所以他有可能指向了一个不归自己程序使用的内存地址,对于其他程序来说是很危险的,对自己程序来说也是不容易被控制的。
7.内存泄露:JAVA引用不会产生内存泄露。C++指针是容易产生内存泄露的,所以程序员要小心使用,及时回收。
8.作为参数:JAVA的方法参数只是传值,引用做为参数使用时候,回给函数内引用的值的COPY,所以在函数内交换两个引用参数是没意义的,因为 函数只交换的参数的COPY值,但在函数内改变一个引用参数的属性是有意义的,因为引用参数的COPY所引用的对象是和引用参数是同一个对象。 C++指针做为参数给函数使用,实际上就是他所指的地址在被函数操作,所以函数内用指针参数的操作都将直接作用到指针所指向的地址(变量,对象,函数,等 等)。
9.操作符和声明:java里用"."。C++指针用"->" 用"*"声明指针。(似乎这条没什么用!)
10.本质:java中的引用和C++中的指针本质上都是想通过一个叫做引用或者指针的东西,找到要操作的目标(变量 对象等),方便在程序里操作。所不同的是JAVA的办法更安全,方便些,但没有了C++的灵活,高效。
java中的引用和C++中的指针,他们最好不要混在一起,也不要认为是一回事,只不过他们的作用有些相似,总叫人不自觉的对比。但在我们写 JAVA程序的时候最好忘记C++的指针,写C++程序的时候,也不要老惦记着JAVA的引用。只要记得 引用无大小,安全,不可计算,强转时要小心就好了。
作者: 黄玉昆    时间: 2013-2-23 15:02
在某种程度上来说是一样的。你可以看看我总结的这篇文章。
地址:http://blog.csdn.net/shengfeixiang/article/details/8578441
作者: 刘圣繁    时间: 2013-2-24 00:10
它没有显式的使用指针,其实Java语言内部的实现机制来说是肯定有指针的(有点废话了。。。)用不用一样东西是看有没有必要去用。Java是一个纯面向对象的语言,基本上来说,程序员不需要关心内存的分配与释放的操作(jre、虚拟机帮忙做了),既然不关心内存那么没必要引入指针这么种相对复杂而容易重大错误的一种形式。其实Java里边充斥着引用的说法,从某种角度上说,引用就是指针的简化版。。。
作者: 邢义敏    时间: 2013-2-24 08:56
本帖最后由 邢义敏 于 2013-2-24 09:01 编辑

首先, 在Java中, 不存在引用传递(也就是地址传递)一说, 全部都是值传递, 自然, 在使用对象时实际上都是使用的引用

  Java语言明确说明取消了指针,因为指针往往是在带来方便的同时也是导致代码不安全的根源,同时也会使程序的变得非常复杂难以理解,滥用指针写成的代码不亚于使用早已臭名昭著的"GOTO"语句。Java放弃指针的概念绝对是极其明智的。但这只是在Java语言中没有明确的指针定义,实质上每一个new 语句返回的都是一个指针的引用,只不过在大多时候Java中不用关心如何操作这个"指针",更不用象在操作C++的指针那样胆战心惊。

  非也,基本类型数据存放在Stack中,存放的是数据。而产生对象时,只把对象的reference存放在stack中,用于指向某个对象,对象本身存放在Heap中。

  还有, 调用方法时传递的参数以及在调用中创建的临时变量都保存在栈(Stack)中,速度较快。其他变量,如静态变量、实例变量等,都在堆(Heap)中创建,速度较慢。另外,依赖于具体的编译器/JVM,局部变量还可能得到进一步优化。

  从实现上来讲,引用可以理解为一种受限的指针,引用底层可以采用指针来实现,也可以采用句柄的方式实现。早期jvm一般采用句柄的方式,现在的jvm,比如sun的,IBM的,一般就是用指针来实现。

  不过从语言的角度来将,没有必要把java的引用和C的指针来比较。

  指针是可以进行与整数做加减运算的,两个指针之间也可以进行大小比较运算和相减运算。

  引用不行,只能进行赋值运算。



作者: 陈科宇    时间: 2013-2-24 13:51
引用的目的就是封装指针操作的概念,让程序员不过多地关心复杂的内存操作。但引用的实质就是指针。
作者: 王宝生    时间: 2013-2-24 20:39
搞java的没必要区分这种东西,对于java程序而言,指针和引用都是地址,是某一个对象的地址。




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