java参数传递之值传递
一 概述
1.什么是参数传递?
调用方法时向形参传递数据的过程叫做参数传递。在编程语言中有两种传递方式:值传递与引用传递。必须强调的是,这里提到的两种传递方式不是仅限于java使用到的传递方式,而是出现在包括java在内的多种编程语言中的传递方式。
2.变量类型
在java中,我们将指向基本类型数据的变量称为原始变量,将指向对象的变量称为引用变量。
二 值传递
1.什么是值传递?
将变量的副本传入方法,方法内外操作隔离,在方法内对变量的操作不会反映到方法外的变量中。
2.原始变量
public void change(int b) {
b = 7;
}
@Test
public void testBasic() {
int a = 9;
change(a);
System.out.println(a);
}
实际输出:9
在参数传递时,按照值传递的规则,变量b接收一个a的副本,同样指向字面值“9”:

接下来,在方法内部,为b赋值7,这样b指向7,由于a与b是两个相互独立的变量,两者之间没有引用与被引用的关系,a依然指向9:

3.String
public void change(String str01) {
str01 = "baidu";
}
@Test
public void testString() {
String str = new String("www.baidu.com");
change(str);
System.out.println(str);
}
实际输出:www.baidu.com
在参数传递时,str将自身的一个副本传递给str01,这样str01也指向堆中存放“www.baidu.com”的对象:

在方法内部为str01赋值,这样str01就指向方法区字符串常量池中的"baidu",str依然指向堆中的“www.baidu.com”,str与str01指向不同的对象,相互之间不影响:

这里需要注意一点:java将String设计成不可改变的对象,即一旦String对象包含的字面值发生改变,java就会新建一个对象,并将变量指向新的对象。
4.StringBuilder
public void change(StringBuilder builder01) {
builder01.append(" World!");
}
@Test
public void testStringBuilder() {
StringBuilder builder = new StringBuilder("Hello");
change(builder);
System.out.println(builder);
}
实际输出:Hello World!
在参数传递完成以后,builder01变量获得builder变量的一个副本,副本与原始变量指向堆中同一个对象:

在方法内部,变量builder没有指向新的对象,依然与builder指向同一对象,所以当builder访问堆中同一对象时,数据发生改变:

5.自定义类型
public class MyInner {
public int a;
}
public class Test{
public void change(MyInner in01) {
in01.a = 1;
}
@Test
public void testDemain() {
MyInner in = new MyInner();
in.a = 9;
change(in);
System.out.println(in.a);
}
}
实际输出:1
执行过程同StringBuilder执行过程相同,这里不再赘述。下面对上面的代码做一点改动,如下:
public class MyInner {
public int a;
}
public class Test{
public void change(MyInner in01) {
in01=new MyInner();//使in01指向一个新的对象
in01.a = 1;
}
@Test
public void testDemain() {
MyInner in = new MyInner();
in.a = 9;
change(in);
System.out.println(in.a);
}
}
实际输出:9
参数传递完成时,in01与in指向同一个对象,in01对对象的操作等同于in对对象的操作,接着在方法内部执行"in01=new MyInner();",这样in01就指向了一个新的对象,in01所有的操作都与in无关了:

综合以上的运行结果与分析,可知java参数传递方式符合值传递。
三 引用传递
1.什么是引用传递?
将变量自身的内存地址传入方法中,方法中的变量指向方法外的变量,在方法中对变量的操作就是对方法外变量的操作。
2.自定义类型
public class MyInner {
public int a;
}
public class Test{
public void change(MyInner in01) {
in01=new MyInner();//使in01指向一个新的对象
in01.a = 1;
}
@Test
public void testDemain() {
MyInner in = new MyInner();
in.a = 9;
change(in);
System.out.println(in.a);
}
}
实际输出:9
如果采用引用传递,传递完成以后,in01指向in,对in01的操作就是对in的操作,in01指向对象2,那么in也指向对象2,输出1,与实际不符,所以不是采用引用传递。

不再一一分析其他变量类型,分析后可以发现,java在传递参数时采用的不是引用传递,而是值传递。
简单讲,值传递时方法内外是两个拥有同一指向的变量,引用传递时方法内外是同一个变量。
参考:
http://blog.csdn.net/u013366812/article/details/52062178
http://www.cnblogs.com/buywine/p/6420555.html
http://www.cnblogs.com/clara/archive/2011/09/17/2179493.html
http://blog.sina.com.cn/s/blog_4df91b180100nozy.html
java参数传递之值传递的更多相关文章
- Java参数传递是值传递还是引用传递?
当一个对象被当作参数传递到一个方法后,在此方法内可以改变这个对象的属性,那么这里到底是值传递还是引用传递? 答:是值传递.Java 语言的参数传递只有值传递.当一个实例对象作为参数被传递到方法中时,参 ...
- java参数传递(值传递还是引用传递)
Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)”,争论的双方各执一词,互不相让.不但“菜鸟”们一头雾水,一些“老鸟”也只知道结果却说不出所以然来.我相信看过下面的内 ...
- Java 中的值传递和参数传递
Java中没有指针,所以也没有引用传递了,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements 接口实现多继承的功能 值传递:方法调用时,实际参数 ...
- Java中的值传递和引用传递
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...
- 为什么说Java中只有值传递
本文转载自公众号 Hollis 对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文 ...
- 一道笔试题来理顺Java中的值传递和引用传递
题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...
- 为什么说Java中只有值传递(转载)
出处:https://www.hollischuang.com/archives/2275 关于这个问题,在StackOverflow上也引发过广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同, ...
- 为什么说Java中只有值传递?
一.为什么说Java中只有值传递? 对于java中的参数传递方式中是否有引用传递这个话题,很多的人都认为Java中有引用传递,但是我个人的看法是,Java中只有值传递,没有引用传递. 那么关于对象的传 ...
- JAVA中只有值传递
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
随机推荐
- Jenkins持续集成企业实战系列之Jenkins配置演示-----03
注:原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 最初接触Jenkins也是由于公司需求,根据公司需求Java代码项目升级的.(公司是 ...
- 将0移到最后,在原数组操作,并且不能改变源数据顺序(JS编程)
一.问题描述: 将0移到最后,在原数组操作,并且不能改变源数据顺序. 示例:输入:[2,0,0,1,0,3], 结果:[2,1,3,0,0,0] 二.问题分析与解决: 注意是在原数组上操作,不要进行 ...
- 在执行 Database.SqlQuery Method (String, Object[]) 执行中出现错误
执行类似于 var params = new SqlParameter[]{--}; Database.SqlQuery<Type>(sql1,params); Dat ...
- 在Pd中取消Code Name 同步
以前记得现在忘记了,好不容易找回来,记住备忘吧.
- Domoticz 中添加彩云天气
前言 用过一段时间的彩云天气 APP,最吸引我的地方是精确到局部区域的天气预测,虽然准确度并不算高,但是对于预测下雨还是不错的选择.在 Domoticz 中添加彩云天气的数据,利用的是彩云天气提供的 ...
- redux超易学三篇之二(开始使用react-redux)
其实 redux 真正让人感到混乱的还是在 react-redux 的使用中. 请配合完整代码参考~:完整源代码 也不是说混乱,主要是网上 推崇 最佳实践.学习一个新东西的时候,本来就很陌生,上来就用 ...
- <!-- -->是HTML的注释标签js,css注释
<!-- -->是HTML的注释标签 js,css:单行注释以 // 开头. 多行注释以 /* 开始,以 */ 结尾. web大作业(Vip视频解析) <!-- 这个网页是vip视频 ...
- POJ - 1456 贪心 堆常用操作 注意细节
题意:给定n个商品的deadline和profit,求每天卖一件的情况下的最大获利 显然是一道贪心 按deadline从小到大排序好,动态维护小根(profit)堆的大小<=当前deadline ...
- shopNC开发手册
链接: https://wenku.baidu.com/view/b9232d24dd3383c4bb4cd2c9.html https://wenku.baidu.com/view/ff1566 ...
- Spring Annotation(注解)
Spring Boot Annotation @SpringBootApplication 必须作用在main 方法所在类 @RequestMapping @GetMapping @PostMappi ...