JAVA中的引用到底是什么意思

talentedalone 2008-04-28 11:31:56
JAVA中的引用到底是什么意思,我搞不懂啊
和C++中的是不是相同那?
...全文
347 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
awusoft 2008-04-29
  • 打赏
  • 举报
回复
不用管,引用就是指向那个对像.

String str="aa";

str有本身的内存,是一个变量,而对像"aa"也有它自己的内存空间.
这时候说str引用"aa"这个对像.

String tt=null;
这里的tt也是一个引用变量,但是它没有引用具体的对像.


String str="aa";
String tt=str;

这里str与tt都是一个引用变量(属于String类型的,只能引用String类型对像),记住:str它的内存空间里的值是一个地址值,tt的内存空间也是一个地址值.
它们的值就是具体对像的首地址(首地址也就是内存地址)
str的值为AD12EE51一个地址值
"aa"这两个字符(也就是具体的对像)在内存里分配空间的时候首地址也就是AD12EE51


JVM会知道它们是不是引用变量(相对于原始类型int ,long等变量),JVM知道一个变量为原始变量的时候就会根据它们的值-->一个地址值 再去访问具体的内存空间,也就是访问到具体的对像.因为tt=str;就是把str的值-->一个地址值复制给tt,所以在运行 的时候JVM发现tt也是一个引用变量,就根据它的值(与str的值一样) 去访问具体的内存空间,因为tt与str的值相等,所以说:tt与str引用对一个对像.

关于引用传值:

StringBuffer sb = new StringBuffer();
sb是一个引用变量,当执行到new StringBuffer()的时候就会分配一段内存空间给这个对像使用,并把这段空间的首地址返回,也就是把首地址返回给sb变量,就形成了"sb引用这个对像".
有一个方法
void addString(StringBuffer sbe)
{
sbe.append("function");
}
下边这段代码:
StringBuffer sb = new StringBuffer();
sb.append("hh");
addString(sb);
System.out.println(sb.toString());


结果是:hhfunction
原理:sb引用一个具体的对像,它的值是一个StringBuffer对像的首地址,执行到sb.append("hh");在那个具体对像的地方就会加上这个"hh"字符串,然后执行到
addString(sb);实际就是把sb的值(什么值?想想)传给方法里的参数,那个方法的参数StringBuffer sbe只是一个引用变量,当执行这句代码的时候就是把sb的值传给sbe,然后执行方法时的代码,sbe 与sb都是引用同一个对像,因为它们的值相同.所以在方法里访问sbe实际就是访问原来sb所指向的那个对像.

相当与下边这段代码
StringBuffer sb = new StringBuffer();
sb.append("hh");
StringBuffer sbe=null;//这里相当与方法的参数
sbe=sb;//调用方法的时候就会执行这样的结果,把sb的值给与sbe
sbe.append("function");//这一句相当与方法里的代码.


结果也是hhfunction.

有时候说sb这个对像,实际就是说sb所引用的那个对像.
xiaomaha 2008-04-29
  • 打赏
  • 举报
回复
地址`
zlss_17 2008-04-29
  • 打赏
  • 举报
回复
个人看到的------------
java中:
定义一个对象变量:
Date date;
他可以引用Date类型的对象,他不是一个对象,现在也没有引用对象。
任何对象变量的值都是对存储在另外一处的一个对象的引用
如:
Date date = new Date();
new Date()新创建一个对象,他的值是对新创建对象的引用,被存在date中。
对象变量可显式设为空
date = null;

-----------
c++中:
没有空引用,引用不能被赋值,java中对象变量相当于c++中的对象指针;
Date date = new Date();//java
相当于
Date *date = new Date();
如2楼所说
aipb2008 2008-04-29
  • 打赏
  • 举报
回复
JavaClass jc = new JavaClass();

equals to :

CppClass *cc = new CppClass();

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
final JavaClass jc = new JavaClass();

equals to :

CppClass *const cc = new CppClass();
or
CppClass const *cc = new CppClass();

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
no forms in java

equals to :

const CppClass *cc = new CppClass();
nihuajie05 2008-04-29
  • 打赏
  • 举报
回复
基本是一样的....但是总觉得指针的话...你也学C++,告诉我指针和引用的区别呢?真心求教
nihuajie05 2008-04-29
  • 打赏
  • 举报
回复
呵呵...我说下thinking in java 原文吧
在上个版本我还叫它是handle,来特意区别C++中的reference.不过在这一版里,我还是更改成reference.因为特意去区别他们是没有理由的
他们本来就很相象
chenhongxin 2008-04-29
  • 打赏
  • 举报
回复
引用其实像C++里的指针,内存在栈中分配空间,而它本身存的又是对像的地址
awusoft 2008-04-29
  • 打赏
  • 举报
回复
awusoft 2008-04-29
  • 打赏
  • 举报
回复
都不行哦,不知道怎么添加图片了.
awusoft 2008-04-29
  • 打赏
  • 举报
回复
awusoft 2008-04-29
  • 打赏
  • 举报
回复
试试添加图片行不行.
ZHOUJIAOSHOU 2008-04-28
  • 打赏
  • 举报
回复
引用其实像C++里的指针,内存在栈中分配空间,而它本身存的又是对像的地址

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧