什么是值传递?什么是引用传递?

值传递是将要传递的值作为一副本传递.如

int i=4;

int j=i;

这里相当于把14复制了一个副本给j,结果是i=4,j=4

引用传递,传递的是引用对象的内存地址

int *p,*p1;

int j=5; *p=j; //这里是把j在内存当中的地址赋给了指针p

p1=p;  //这里是把指针p中保存的地址(就是j的地址)赋给了指针p1

j=4; //这里改变j的值 输出结果是 j=4 , *p=4 , *p1=4 //因为p和p1指向的都是j 所以他们的值随j值改变

(以上说明和代码来自http://zhidao.baidu.com/question/31191252.html)

Java中函数参数的传递是值传递还是引用传递?

Java中参数传递时传递到函数中的参数都是原变量的一份拷贝,对于非类类型如int,float等,这份拷贝自然和原变量脱离了关系,这不难理解;

而对于类的实例而言,这份拷贝恰巧是实例引用的拷贝,它(参数)指向的实例地址和原实例引用指向的实例地址都是一样的,因此对参数的修改有时也会影响到实例本身,故此造成了Java传递类实例是传递的引用即地址的假象,如下面例子中的changeMemberField函数,但是我们把参数指向的地址改到别的实例上时,如changeMember函数,我们会发现参数和原实例引用再也不会发生关系了,这里证明Java中参数传递是完完全全是传值而不是传址。

例子代码:

代码:

package com.sitinspring;

public class ChangeClass{

public void changeInt(int i){

i=5;

}

public void changeLong(long i){

i=555;

}

public void changeString(String str){

str="5555";

}

public void changeMember(Member member){

member=new Member("Cindy",35);

}

public void changeMemberField(Member member){

member.setAge(20);

member.setName("Andy");

}

public static void main(String[] args){

ChangeClass changeClass=new ChangeClass();

int intValue=10;

changeClass.changeInt(intValue);

System.out.println(intValue);

long longValue=10;

changeClass.changeLong(longValue);

System.out.println(longValue);

String stringValue="1234";

changeClass.changeString(stringValue);

System.out.println(stringValue);

Member member2=new Member("Douglas",45);

changeClass.changeMember(member2);

System.out.println(member2);

Member member=new Member("Bill",25);

changeClass.changeMemberField(member);

System.out.println(member);

}

}

package com.sitinspring;

public class Member{

private String name;

private int age;

public Member(String name,int age){

this.age=age;

this.name=name;

}

public String toString(){

return "Member name="+name+" age="+age;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

}

输出:

10

10

1234

Member name=Douglas age=45

Member name=Andy age=20

解释:

第一个输出10是因为int是基本类型,传递的参数是intValue的拷贝,对拷贝的修改对原值intValue没有影响.

第一个输出10和上面是一个道理.

第三个输出1234.由于String是类类型, str是stringValue的地址拷贝,参数str指向的地址和stringValue的一致,但在函数changeString 中,由于String的特殊性, str=“5555”和str=new String(“5555”)是等价的, str指向了新的”5555”所在的地址,此句后str就与原来的stringValue彻底脱离了联系.

第四个输出Member?name=Douglas?age=45的道理和上面相同.

第五个输出Member?name=Andy?age=20是因为changeMemberField函数中修改了参数member 的值,也就是修改member指向实例的值,而这个实例正是member指向的值,因此member就变成了name=Andy 且age=20.

结论

Java中参数传递的都是值,对应基本类型,传递的是原值的拷贝;对于类类型,传递的是引用即地址的拷贝.

对于函数对参数的改变是否会影响原值的问题:值类型自然不会影响到原值.而对于类类型要看改变的是参数的地址还是值,如果是前者,参数和原引用指向了不同的地址,它们自然脱离了关系;如果是后者,修改的实例就是原引用指向的实例,这当然对原值进行了修改.

代码下载:

http://www.blogjava.net/Files/sitinspring/PassValueOrReference20080116142420.rar

posted on 2008-02-22 09:19 和风细雨 阅读(4343) 评论(6)  编辑  收藏

java中的传参是什么意思_Java中参数传递是传值还是传址?相关推荐

  1. java url传参中文乱码问题_java中url传中文参数出现乱码

    缘由:java Http请求传输时将url以ISO-8859-1编码,服务器收到字节流后默认会以ISO-8859-1编码来解码成字符流(形成中文乱码).服务器 方法一:编码 咱们须要把request. ...

  2. 根据接口文档中的入参,生成自动化测试用例中的异常测试用例,包含用例描述,用例数据

    根据接口文档中的入参,生成自动化测试用例中的异常测试用例,包含用例描述,用例数据 参考文章: (1)根据接口文档中的入参,生成自动化测试用例中的异常测试用例,包含用例描述,用例数据 (2)https: ...

  3. go语言接收html传值,Go语言参数传递是传值还是传引用

    本文为原创文章,转载注明出处,欢迎扫码关注公众号flysnow_org或者网站http://www.flysnow.org/,第一时间看后续精彩文章.觉得好的话,顺手分享到朋友圈吧,感谢支持. 对于了 ...

  4. 女朋友问我:小松子,你知道Go语言参数传递是传值还是传引用吗?

    前言 哈喽,大家好,我是asong.今天女朋友问我,小松子,你知道Go语言参数传递是传值还是传引用吗?哎呀哈,我竟然被瞧不起了,我立马一顿操作,给他讲的明明白白的,小丫头片子,还是太嫩,大家且听我细细 ...

  5. java调用python,传参json字符串,含中文传参

    java调用python,传参json字符串 python脚本内容(test.py) # -*- coding: utf-8 -*-def main(input):return input java调 ...

  6. java 传参需要定义吗_java的传参究竟是按值传递的还是按引用传递的

    这里来弄清楚Java的传参究竟是按值传递的还是按引用传递的. 形参和实参 传参的概念里,有形参和实参的区分.形参是定义方法名和方法体的时候使用的参数,目的是用来接收调用该方法的时候传入的参数:实参是调 ...

  7. URL传参小用法获取url中的参数

    写页面的时候发现的小用法,记录下来,关于url静态传参的问题. 首先列举下获取URL中参数的几种方法 方法一:正则法 这个正则是寻找&+url参数名字=值+&*/     这里参考网址 ...

  8. @query传参_前端框架vue中query和params传参

    注意(用params传参,F5强制刷新参数会被清空,用query,由于参数适用路径传参的所以F5强制刷新也不会被清空.(传参强烈建议适用string)) 也可以选用sessionstorage/loc ...

  9. 根据接口文档中的入参,生成自动化测试用例中的异常测试用例,包含用例描述,用例数据...

     不想当将军的小兵,不是好的小兵:不想做开发的测试,不是好的测试: 不管你信不信,我是信了... 一直以来,内心总有些迷茫的时候,迷茫的是作为测试既然要学那么多编程,为什么不直接去干开发呢? 看了这句 ...

  10. python中函数的参数传递(传值还是传引用)

    函数的参数传递 函数参数传递有两种方式,传值和传引用,传值只是把变量的值复制一份给了实参,函数内部的操作不会改变函数外部变量的值,而传引用传递的是外部变量的地址,函数内部直接操作函数外部变量的储存空间 ...

最新文章

  1. ASP.NET2.0中的ClientScriptManager 类用法—如何添加客户端事件!
  2. 浅谈python+requests接口自动化框架
  3. 量子计算机混战:新贵离子 vs 老派超导体
  4. Flask Vue.js全栈开发
  5. SAP SD:SAP信贷出口
  6. 学习、纪律与交流——《Clean Coder》读后感
  7. 凡人修仙传显示无法连接服务器,《凡人修仙传》网络异常及橙色BOSS补偿说明...
  8. java怎么获取ie浏览器的cookie,IE8 浏览器Cookie的处理
  9. Markdown——编辑器语法——字体、字号与颜色
  10. 计算机网络二级考试类型,二级计算机考试大纲
  11. Linux指令--touch
  12. php.js 文件下载,使用JavaScript开始下载文件
  13. oracle密码重用,关于Oracle 9i数据库密码重用规则分析
  14. 浮云语音转文字识别本地音频文字内容教程
  15. markdown中打勾,对号和打叉,表格内换行
  16. 微信小程序学习笔记4
  17. 索引导致大量写入数据时效率低下
  18. 硬盘安装linux镜像文件iso安装,通过ISO文件硬盘安装Ubuntu系统
  19. execl 如何同时冻结一行与一列
  20. win10 如何查看redis版本

热门文章

  1. meterial design 5.0 新增控件介绍及使用方法
  2. 无线测温产品在轧钢厂项目中的应用
  3. 游戏热更新:游戏客户端热更新那点事
  4. 找不到战网服务器ip地址,wow服务器ip地址-我怎么知道战网服务器的IP地址去PING, – 手机爱问...
  5. 应用之星教你制作高下载量的App
  6. 基于vue-simple-uploader 实现大文件分片上传(一)
  7. codewars题目解答Multiples of 3 or 5
  8. android 按钮果冻效果,用Tween动画简单模拟果冻按钮效果
  9. [error]: Found option without preceding group in config file ....\my.ini at line:1
  10. 小孩终生教育工程(人生管理):有些东西比努力比钱更重要