java中到底有没有指针到底是什么

喵呜,喵呜,问问各位媛媛,java里到底有没有指针啊?_女程序员吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:3,040贴子:
喵呜,喵呜,问问各位媛媛,java里到底有没有指针啊?
到底有没有啊?有没有啊?有没有啊?
千锋程序员?千锋Android工程师保持月薪业内高逼格水平,足不出户挑工作,千锋真正懂教学的名师授教,真实前沿的项目实训,真实的就业数据是程序员之根本!
。。。。这个貌似是没有吧,
表面上没有,实际上确实有,只不过是JAVA的底层被C都写好了。
用到的没有
没有指针。
没有指针变量。
JAVA里面没有,指针要去学C++
没!有!所以,安全!所以,受欢迎!
女程序员培训选甲骨文,4个月学习,上万家就业合作企业任你选,1-2年工作经验,月薪上万起,人才缺口上百万.找份好工作,拿满意工资.
没有,但是又很多替代方法
个人也考虑了很久这个问题,每每深入一点都会想到这个问题。目前阶段是认为,所谓的是基于面向过程的面向对象语言。因为的存在,将编译好的文件再解释成底层机器语言。所以我们只是在地面上写着面向对象的语言,由编译器检查下有没有什么语法问题,再然后虚拟机在地下把我们写好的代码全部翻译。之前看个String的拘留字符串,就感觉像是地面上的字符串映射到地下的时候会判定是否两个字符串相同,相同的话地下就只拘留一个。而不重复拘留。但是地上的两个全部映射到地下的这一个拘留字符串而已。。。完蛋,我明明只研究了这一个的底层问题的。。。班门弄斧了。。
专业广告三十年 图片来自:图片来自:
图片来自:
贴吧热议榜
使用签名档&&
保存至快速回贴java中内存的分配方式有两种,一种是在堆中分配,一种是在堆栈中分配,所有new出来的对象都是在堆中分配的,函数中参数的传递是在栈中分配的。通常情况下堆的内存可以很大,比如32位操作系统中的虚拟内存都可以被堆所使用(当内存紧张的时候甚至硬盘都可以是堆的存储空间),而堆栈的内存分配是有限的。
这和c++中内存分配差不多。java中有几种基本类型如int,float,double,char,byte等,他们不是对象,除此之外一切都是对象,所有的对象都是在堆上分配的。但好像在C#中这些都有封装好的一些方法,应该算是对象。
java中对象数组是什么,和c++类似,是句柄数组或者叫指针数组,里面保存的是每个元素的地址。和c++中不同,java没有操作符重载和拷贝构造函数(如果不了解这些也没有关系),因此当创建对象或者对已经创建的对象赋值时(注意是对象,不是基本类型):Object a=new Object 和Object a=b(b是Object的子类型或者同类型)时,进行的是对象地址的传递并复制。这就是所说的句柄的传递和赋值。
句柄里存储的就是对象的地址,句柄就是指针,只不过是你无法得到的地址,java就是通过这一点巧妙的将指针隐藏起来。当对象作为参数传递到方法中时,传递的就是对象的地址,而行参中保存的是实参地址的副本(这就是最关键的地方,也是值传递,值传递就是将实参的值的副本作为行参)
public&class&Example{
public&class&A{
public&int&i=0;
public Example add0(Example&e)
public&void add1(Example&e)
public&void modify0(Example&e)
Example&b=e;//将e行参对象的地址赋给句柄b
b.i++;//也同时修改了e.i和实参的值
public&void modify1(Example&e)
e=new Example();
public&static&void main(String[] args)
Example ex=new Example();
A a=new A();
a=a.add0(ex);//等价于a.add0(ex),无需返回值,因为通过传递的对象地址(句柄),直接修改了ex中i的值
a.add1(ex);//add0,add1都在其中的方法体中直接修改了ex.i的值,因此add0的返回值有点多余
a.modify0(ex);//对ex所产生的影响同add1
a.modify1(ex);//对ex没有产生任何影响(而且这就是等价于什么也没有做).
这可能会让一部分人搞不清了。为什么呢?因为是对象地址的副本"值传递",在modify1中e=new Example();实际上e仅仅是保存ex对象地址的副本的一个句柄,当对e赋值时仅仅是对堆栈中e的赋值(对ex指针副本的变量e赋值),而并没有改变ex的句柄的指向,当方法调用完毕堆栈弹出,e就将要被垃圾回收,没有任何用处。当然你可以将它作为返回值,这就是另外一回事了。
如果你能明白这个原理,可以避免一些潜在的逻辑错误,如:对象在方法中被改动了,记住c++在这一点上和java有很大的不同,c++默认的是值传递,行参会按照位复制实参(如果用指针或者引用就和java很类似了),在方法中作为参数传递对象,java更象是c++中传递引用,当然还是有区别的,那就是c++中对象的引用不可再赋值为另一个对象。
本文为转载!&
阅读(...) 评论()Java中有没有指针?何为引用? - sphere
先说下C++中的指针,指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址,它是变量可以做运算,而引用不可以。程序员可以操作指针控制内存,而引用不可以。引用和指针有相似之处,却又被限制某些特性,我认为引用可以理解为狭义上的指针,但并不完全等同,以下片段来自thinking in Java有人认为:很明显,它是一个指针。但是这种说法是基于底层实现的某种假设,并且Java中的引用,在语法上更接近C++的引用而不是指针,但是Java中的引用和C++中的引用存在一些重大差异。我曾经读到一本书是这样说的:Java所支持的‘按址传递’是完全错误的。因为Java的对象标识符(按那位作者所说)实际上是“对象引用”。并且他接着说任何事物都是“按值传递”(PS:记得看孙鑫老师的Java无难事视频时好像也是这么说的)。也许有人会赞成这种精神却让人费解的解释,但是我认为我的这种方法可以简化概念上的理解并且不会伤害到任何事物,我只是提供一个合适的抽象罢了。总结:个人觉得讨论Java中到底有没有指针或者引用是不是指针这种问题没有什么意义,能用好引用,尽量少发生java.lang.NullPointerException &无奈这货为什么被翻译成空指针异常啊。欢迎访问我的博客
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 c 中有没有指针 的文章

 

随机推荐