JAVA到底有没有引用传递??? JAVA值传递引用传递 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 分两种情况, 第一种 基础类型, 这个java里不管是效果还是形式, 只有值传递第二种 对象, 这个表现比较奇怪, 效果其实更像是指针而不是引用。而指针,说白了是值传递,传递的是地址值。 java这边也一样, 只是没有指针的形式罢了。 同意该总结,同事对第二种说法进行一下说明,参数是类类型的时候,在传入实参时,如果直接传 new cType(),表示传入的是对象本身,如果传入已经声明好的对象名,则传入的是引用。 举例说明:class cType{public value;}void fun(cType cobj){cobj.value = 10;}1.调用函数:fun(new cType());此时传入的是对象本身。2.首先声明对象:cType c = new cType(); 调用函数:fun(c);此时传入的是对象的引用,这是调用函数返回之后,对象c的value值为10。 Java中传递值有两种方法pass by valuepass by reference肯定有啊!对于wrapper多数时候请用pass by reference. Java 传一般变量的时候使用的是“值传递”Java 传对象(Object)的时候使用的是“引用传递” 你对值的理解有些偏差,java的引用传递只是传递了一个地址,而不是整个对象的值。而值传递是传递整个数据的值。反正引用传递说破大天也不是值传递,按你的理解,可能是觉得引用传递这个叫法不准确吧。 感觉你的说法很有道理,但不知道你说的“传递的都是栈里的的值”是不是正确的。请问有出处吗?JAVA传递的只有值,这个是肯定的了.传递的都是栈里的的值.这句你可以分析一下JAVA的存储机制.它出处是我总结的.哈哈.不知道有哪些书说到.我博客里也写了一篇简单的值的传递的笔记http://blog.csdn.net/java_jh/article/details/16921357 这里. 对象的传递. 例如.对象1的两部份.内存地址--A 内存--a对象2 = 对象1 那么对象2的两部份是 内存地址--A副本 内存a 它们只是传递了栈里的内存地址.对象1与2 是共用一个内存空间的.而不是对象2重新开辟一个同样大小的空间.. 你修改A副本,直接影响到 内存a就好像一个银行账户.取钱方式有一本存折,一张银行卡..无论你用哪种方式取钱.都会影响到账户余额.所以这不是"引用传递". 只是内存地址的值的传递. 这里. 对象的传递. 例如.对象1的两部份.内存地址--A 内存--a对象2 = 对象1 那么对象2的两部份是 内存地址--A副本 内存a 它们只是传递了栈里的内存地址.对象1与2 是共用一个内存空间的.而不是对象2重新开辟一个同样大小的空间.. 你修改A副本,直接影响到 内存a就好像一个银行账户.取钱方式有一本存折,一张银行卡..无论你用哪种方式取钱.都会影响到账户余额.所以这不是"引用传递". 只是内存地址的值的传递. 嗯,非常感谢。看了你的解释我明白了。我总结一下就是:基本类型,复制的就是一个值,这个值是实参的副本,你对这个副本的任何操作都不会影响到实参。引用类型,它传递的也是值,这个值是引用的内存地址的复制(相当于两个引用指向了堆中同一对象),那么你对这个对象的操作会同时影响实参和形参。所以,基本类型就是”值传递“,而引用类型就是”引用传递“。 不好意思,原理我明白了。但是,我还是想问一下:JAVA是不是只有值传递?(所谓的引用传递,说白了就是堆中对象的别名,其实都是一个东西嘛。所以传递的也是”内存地址这个值“,是不是也算值传递)那么,在C++中的为什么就有”值传递“和”引用传递“两种呢?我个人还是倾向于基本类型是”值传递“,引用类型是”引用传递“ 给你引用一段编程随想的博文:★传参的问题 引用类型(在函数调用中)的传参问题,是一个相当扯的问题。有些书上说是传值,有些书上说是传引用。搞得Java程序员都快成神经分裂了。所以,我们最后来谈一下“引用类型参数传递”的问题。 还是拿刚才的例子,假设现在要把刚才创建的那一坨字符串打印出来,我们会使用如下语句:System.out.println(str);这个语句又是什么意思捏?这时候就两说了。 第一种理解:可以认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。 第二种理解:可以认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。 费了这么多口水,其实不论是传引用还是传值,都可以讲得通,关键取决于你是如何看待参数所传递的东西。这就好比量子力学中“光的波粒二象性”,如果你以粒子的方式去测量它,它看起来像粒子;如果你以波动的方式去观测它,它看起来像波动。假如你不太懂量子力学,前面这话当我没说 :-)出处:http://program-think.blogspot.com/2009/03/java-reference-types-detail.html 这个问题在《practice java 》中第一个为我们解答的就是,你可以自己去看看 OK。看了很多高手的解答+网上搜资料。总结如下:JAVA确实只存在:”值传递“基本类型:”值传递“,无异议引用类型:内存地址传递。首先内存地址是一个值,而我们当成参数时,实际会生成这个值(内存地址)的副本,它和实参指向了堆上相同的对象,而不是在堆上新建一个对象。说白了,还是值的复制。所以,引用类型本质上说还是”值传递“=================================================================================引用《Head First Java》P78页的原文:问:如果想要传入的参数是对象而不是primitive主数据类型会怎样?答:你会在稍后的章节中知道有关这件事情更多的细节,但是你早就知道答案了。在Java中所传递的所有东西都是值,但此值是变量所携带的值。还有,引用对象的变量所携带的是远程控制而不是对象本身。若你对方法传入参数,实际上传入的是远程控制的拷贝。=================================================================================1. 上文中,primitive主数据类型就是基本类型(8大类)2. 红色字体清晰指出”Java只有值传递“3. 远程控制就是内存地址4. 远程控制的拷贝,很明显值的复制,所以是”值传递“=================================================================================如果各位还有异议,请明确指出出处。最好是摘抄原文方便大家查看。当然,也欢迎有根据的提出自己的见解。我觉得这个问题应该搞清楚,所以,如果有人能把C++为什么同时有”值传递“和”引用传递“,而JAVA只有”值传递“(或者JAVA也同时有”值传递“和”引用传递“)的原因讲清楚,我想很多人都会或偶然开朗的。谢谢~~~ 第二种理解明显的错的,str只是一个引用。new StringBuffer()才是一个对象。 学了JAVA,还真没认真区分过这个问题,一直把它当作和C语言的指针来处理,只是JAVA里面没有指针这一概念而已 我上午看了一篇文章,也是说的这个参数传递问题的,我感觉很容易理解,不懂的可以去看下http://blog.csdn.net/cocoa_cactus/article/details/16992091 关于hibernate二级缓存出现的问题,求教 JSP增删改查! java内存问题 在启用了ssl认证后,如何保存cookie? 大家帮忙看看这条错误怎么调? 使用eXtremeComponents的问题 J2EE项目的main方法在哪里? 请问一个关于数据库连结关闭的问题 请求帮助!TOMCAT连接池使用JBX问题 j2ee与其他服务器结合方面的小问题 调用数据库数据显示在jsp页面上。为null。 Unreachable code
第一种 基础类型, 这个java里不管是效果还是形式, 只有值传递
第二种 对象, 这个表现比较奇怪, 效果其实更像是指针而不是引用。而指针,说白了是值传递,传递的是地址值。 java这边也一样, 只是没有指针的形式罢了。
class cType{
public value;
}
void fun(cType cobj){
cobj.value = 10;
}
1.调用函数:fun(new cType());
此时传入的是对象本身。
2.首先声明对象:cType c = new cType();
调用函数:fun(c);
此时传入的是对象的引用,这是调用函数返回之后,对象c的value值为10。
pass by value
pass by reference
肯定有啊!
对于wrapper多数时候请用pass by reference.
Java 传对象(Object)的时候使用的是“引用传递”
而值传递是传递整个数据的值。反正引用传递说破大天也不是值传递,按你的理解,可能是觉得引用传递这个叫法不准确吧。
感觉你的说法很有道理,但不知道你说的“传递的都是栈里的的值”是不是正确的。请问有出处吗?JAVA传递的只有值,这个是肯定的了.传递的都是栈里的的值.这句你可以分析一下JAVA的存储机制.它出处是我总结的.哈哈.不知道有哪些书说到.
我博客里也写了一篇简单的值的传递的笔记http://blog.csdn.net/java_jh/article/details/16921357
例如.对象1的两部份.内存地址--A 内存--a
对象2 = 对象1 那么对象2的两部份是 内存地址--A副本 内存a
它们只是传递了栈里的内存地址.
对象1与2 是共用一个内存空间的.而不是对象2重新开辟一个同样大小的空间.. 你修改A副本,直接影响到 内存a就好像一个银行账户.取钱方式有一本存折,一张银行卡..无论你用哪种方式取钱.都会影响到账户余额.所以这不是"引用传递". 只是内存地址的值的传递.
例如.对象1的两部份.内存地址--A 内存--a
对象2 = 对象1 那么对象2的两部份是 内存地址--A副本 内存a
它们只是传递了栈里的内存地址.
对象1与2 是共用一个内存空间的.而不是对象2重新开辟一个同样大小的空间.. 你修改A副本,直接影响到 内存a就好像一个银行账户.取钱方式有一本存折,一张银行卡..无论你用哪种方式取钱.都会影响到账户余额.所以这不是"引用传递". 只是内存地址的值的传递. 嗯,非常感谢。看了你的解释我明白了。我总结一下就是:基本类型,复制的就是一个值,这个值是实参的副本,你对这个副本的任何操作都不会影响到实参。
引用类型,它传递的也是值,这个值是引用的内存地址的复制(相当于两个引用指向了堆中同一对象),那么你对这个对象的操作会同时影响实参和形参。所以,基本类型就是”值传递“,而引用类型就是”引用传递“。
还是拿刚才的例子,假设现在要把刚才创建的那一坨字符串打印出来,我们会使用如下语句:
System.out.println(str);
这个语句又是什么意思捏?这时候就两说了。
第一种理解:
可以认为传进函数的是str这个指针,指针说白了就是一个地址的值,说得再白一点,就是个整数。按照这种理解,就是传值的方式。也就是说,参数传递的是指针本身,所以是传值的。
第二种理解:
可以认为传进去的是StringBuffer对象,按照这种理解,就是传引用方式了。因为我们确实是把对象的地址(也就是引用)给传了进去。
费了这么多口水,其实不论是传引用还是传值,都可以讲得通,关键取决于你是如何看待参数所传递的东西。这就好比量子力学中“光的波粒二象性”,如果你以粒子的方式去测量它,它看起来像粒子;如果你以波动的方式去观测它,它看起来像波动。假如你不太懂量子力学,前面这话当我没说 :-)出处:http://program-think.blogspot.com/2009/03/java-reference-types-detail.html
引用类型:内存地址传递。首先内存地址是一个值,而我们当成参数时,实际会生成这个值(内存地址)的副本,它和实参指向了堆上相同的对象,而不是在堆上新建一个对象。说白了,还是值的复制。所以,引用类型本质上说还是”值传递“
=================================================================================
引用《Head First Java》P78页的原文:问:如果想要传入的参数是对象而不是primitive主数据类型会怎样?
答:你会在稍后的章节中知道有关这件事情更多的细节,但是你早就知道答案了。在Java中所传递的所有东西都是值,但此值是变量所携带的值。还有,引用对象的变量所携带的是远程控制而不是对象本身。若你对方法传入参数,实际上传入的是远程控制的拷贝。
=================================================================================
1. 上文中,primitive主数据类型就是基本类型(8大类)
2. 红色字体清晰指出”Java只有值传递“
3. 远程控制就是内存地址
4. 远程控制的拷贝,很明显值的复制,所以是”值传递“
=================================================================================
如果各位还有异议,请明确指出出处。最好是摘抄原文方便大家查看。当然,也欢迎有根据的提出自己的见解。我觉得这个问题应该搞清楚,所以,如果有人能把C++为什么同时有”值传递“和”引用传递“,而JAVA只有”值传递“(或者JAVA也同时有”值传递“和”引用传递“)的原因讲清楚,我想很多人都会或偶然开朗的。谢谢~~~
第二种理解明显的错的,str只是一个引用。new StringBuffer()才是一个对象。