Java中值传递和引用传递的概念
很多书中都提到了在Java中只存在值传递,但是今天在一个NanoHTTPD的源码中看到这样一段:
if (qmi >= 0) {
decodeParms(uri.substring(qmi + 1), parms);
3 uri = decodePercent(uri.substring(0, qmi));
}
/**
* Decodes parameters in percent-encoded URI-format ( e.g.
* "name=Jack%20Daniels&pass=Single%20Malt" ) and adds them to given
* Map. NOTE: this doesn't support multiple identical keys due to the
* simplicity of Map.
*/
private void decodeParms(String parms, Map<String, String> p) {
if (parms == null) {
p.put(QUERY_STRING_PARAMETER, "");
return;
} p.put(QUERY_STRING_PARAMETER, parms);
StringTokenizer st = new StringTokenizer(parms, "&");
while (st.hasMoreTokens()) {
String e = st.nextToken();
int sep = e.indexOf('=');
if (sep >= 0) {
p.put(decodePercent(e.substring(0, sep)).trim(),
decodePercent(e.substring(sep + 1)));
} else {
p.put(decodePercent(e).trim(), "");
}
}
}
上面代码是在调用decodeParms方法的时候传入一个Map对象,该方法返回是void型,因此传入的参数只能在方法内部修改,而不能返回,但是这段代码很明显是影响到对了方法外部的这个对象。这跟java中只有值传递的说法不一致,难道java中存在引用传递?
后来查阅文档后发现,java中确实是只存在值传递。java中对象和基本类型的传递参数传递方式大不一样,对于基本类型,java只是拷贝一个它本身的副本,而对象传递则是传递指向该对象的指针的值。
然而传递对象的指针的值并不代表是引用传递,看下面一段代码:
public class TestPassDemo {
@Test
public void test() {
TestPassDemo test = new TestPassDemo();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("username", "David");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("username", "Nick");
String user = "David";
int i = 1;
changeValue(map1,map2, user,i);
//如果打印的是:{username=admin}则说明java的对象传递的是地址,如果是:{username=David}则传递的是值
System.out.println(map1);//{username=admin}
System.out.println(map2);//{username=Nick}
//如果打印的是:admin则说明java的String对象传递的是地址,如果是:David则传递的是值
System.out.println(user);//David
System.out.println(i+"");//
}
public void changeValue(Map<String, String> map1,Map<String, String> map2, String str,int i){
map2 = map1;
map1.put("username", "Jack");
map2.put("username", "admin");
str = "admin";
i = 10;
}
}
最后输出的结果是这样的:
{username=admin}
{username=Nick}
David
1
这说明了java中对象的传递只是一个指向该对象的指针的值,实际上也可以理解为一种值传递。
这就解释了上面说的java中只存在值传递方法内部为何却能改变外部的变量。
所谓java中的对象,实际上就是C语言中的指针的概念,本质上就是:在堆内存中开辟一块空间,然后使用一个指针来引用它,举一个例子来说的话:
一个Person对象是java中的一个对象,Person有name和age属性,这时需要用一个指针来引用这个Person对象,Person对象又包含了对name对象和age对象的引用,所谓java的对象实际上也是利用C语言的这种指针的概念来实现的。
Java中值传递和引用传递的概念的更多相关文章
- 在Java中字符串是通过引用传递的?
这是一个经典的java问题.在stackoverflow上,许多类似的问题已经被问过了,但是许多回答是错误的或不完整的. 如果你不想深入思考的话,这个问题很简单.如果你想明白的更彻底,那么问题可能容易 ...
- 多图证明,Java到底是值传递还是引用传递?
开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见正文. 说到值传递和引用传递我们不得不提到两个概念:值类型和引用类型. 1.值类型 通俗意义上来说,所谓的值类型指的就 ...
- Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义
一.Java中什么叫做引用类型变量?引用:就是按内存地址查询 比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...
- java中值传递和引用传递
最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- java中方法的参数传递机制(值传递还是引用传递)
看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答:是值传递.Java 编程语言只有值传递参 ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- java中的值传递和引用传递有什么区别呀?
值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...
- Java中的值传递与引用传递
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...
- java中参数传递--值传递,引用传递
java中的参数传递——值传递.引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...
随机推荐
- wex5 实战 单页模式下的多页面数据同步
在wex5官方教程中,关于多页模式与单页模式进行了对比.两者最大的区别在于: 1 web加载速度,单页模式快于多页模式 2 多页模式对加载机制进行了预加载,一次加载之后再次加载,就会加快. 但是,由 ...
- SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显
在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1. ...
- 2016ACM/ICPC亚洲区沈阳站-重现赛
C.Recursive sequence 求ans(x),ans(1)=a,ans(2)=b,ans(n)=ans(n-2)*2+ans(n-1)+n^4 如果直接就去解...很难,毕竟不是那种可以直 ...
- UIScrollView,UIPageControl,UIImageView 实现图片轮播的效果
上一篇博客介绍了如何将XCode创立的项目提交到Git版本控制,这次就直接做一个图片轮播的展示demo,刚好可以把UIScrollView.UIPageControl.UIImageView这三个控件 ...
- wcf 同时支持webhttp 和 引用方式
wcf 实现参考 http://www.cnblogs.com/mingmingruyuedlut/p/4223116.html 兼容两种方式 1.修改服务端webconfig <system. ...
- Thread 和 Runnable 的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口: Thread类是在java.lang包中定义 的.一个类只要继承了Thread类同时覆写了本类中的run ...
- Redis3.20阅读-SDS实现
声明:这是本人参考黄建宏的<redis设计与实现>(源码版本是redis3.0)来学习redis3.20源码的笔记,如果有什么不对的地方,欢迎大家指正,大家一起学习.一起进步,QQ:499 ...
- rgb转16进制 简单实现
function rgbToHex(r, g, b) { return ((r << 16) | (g << 8) | b).toString(16); }
- iStylePDF c#集成开发示例
iStylePDF安装包自带了ActiveX控件,下载安装包安装之后就可以使用,如果没有安装包请到360软件管家或者腾讯软件管家搜索下载.C#的Form中集成ActiveX控件还是非常简单的,选择添加 ...
- jQuery 遍历方法
http://www.runoob.com/jquery/jquery-ref-traversing.html