java中引用和c中引用的区别

java中引用和c中引用的区别

ID:8803431

大小:31.73 KB

页数:3页

时间:2018-04-08

java中引用和c中引用的区别_第1页
java中引用和c中引用的区别_第2页
java中引用和c中引用的区别_第3页
资源描述:

《java中引用和c中引用的区别》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、最近写一个JavaString函数的时候遇到引用原理上的一些问题,当时很急,没有仔细思考,最后通过返回值回避了引用的使用。今天早上上班的路上,突然就想起了当时使用python的时候,同样存在的引用问题,和c++对比后,发现其实问题并没有那么简单。在《java编程思想》里有对java和c++引用的区别的介绍,现在想起来,书的中文翻译对这段的解释并不专业,没有把问题的本质讲清楚。java的引用和python很像,但无论是原理上,还是使用上,都完全不同于c++的引用。Java中的引用在使用上非常类似于c++的指针,相当于

2、通过一个变量存储实际对象的地址,如下例:Aa=newA(1);Ab=a;如上图,a和b作为A(1)的引用,相当于c++中的指针,它们都存储了A(1)的地址。在函数调用时fun(Ax){}当我们调用fun(a)时,实际上相当于执行了x=a;也就是说,现在我们知道java里函数是按值传递的,fun调用时把a的值(A(1)的地址)传递给了x。如果我们通过x更改了A(1),那么所有指向A(1)的引用在使用新的A(1)时都会收到影响,但是,如果在fun(Ax){x=newA(3);}中x被重新赋值,那么对a,b以及它原来指向

3、的A(1)没有任何影响。下面来说c++里的引用,在c++里面,使用引用这个词其实并不恰当,因为c++里的引用其实是一个变量的别名,也就是说Aa=A();A&b=a;这个时候b就是a,只不过换了一个名字而已,b是依托于a而存在的,换句话说,一个人有名字,同时起了一个别名,但是有别名的前提是他必须要有名字,因此,c++不存在空引用。同样用一个函数来说明:fun(A&x){x=A(3);}我们调用fun(a)时,相当于A&x=a;那么在fun的作用域内,x就是a。所有对x的改变就是对a的改变。也就是说,c++里的引用其实

4、是扩展了a的作用域,我们知道c++中函数也是按值传递的,所以引用这样的操作是依靠指针实现的,调用fun(a)时相当于A*tmp_x=&a;x等价于(*tmp_x)。在fun内部所有使用x的地方都被替换为了*tmp_x。那么,有没有可能在java中实现c++中引用的效果呢?如果想完全达到c++中引种的效果是不可能的,但是,可以通过一些包装来完成:比如我们可以借助数组来实现,将原来的a包裹在一个数组内传递进去,我们可以更改fun的定义为:fun(A[]x){}那么我们调用fun时,fun(newA[]{a})就可以了…

5、…注:这里是错了,数组A[0]的位置存储的是a的值,因此对A[0]的改变不会影响a.......昨天脑残了.....所以这种方法是没有意义的,想达到c++的引用效果,在java里的应用层面基本是不可能的,必须从编译层面借助内存地址来实现...python中的引用和java里的引用很类似,因此不做赘述。在java里还有一个问题,当变量类型为基本类型时,不像python一样存在指向常量的引用,而是和c++一样直接在栈上存储数据。这个主要是历史原因造成的,java当年为了兼容c++的部分语法而使得基本类型和c++中的基本

6、类型类似,也就是说java不是完全的面向对象语言,int,float等并不是对象……..类似于这样的问题还有java中的泛型,为了兼容以前版本的代码使得泛型不得不通过擦除机制来实现,和c++的泛型比起来完全是形似而神不似。鉴于以上种种,不得不非常佩服python在3.0版本中表现出的壮士断腕般的勇气…….执着于过去只会让未来的路越走越窄………

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。