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的这 ...
随机推荐
- 在Discuz X 中增加一个单独的页面
如果在DZ中增加一个新的页面,并且取得DZ中相关的用户等乱七八糟的属性,在旧的版本中只要引用一个 -. comm.php 文件就可以,但是在 X 版本以后好像就没.还好,X版本中还是有办法解决的,使用 ...
- 2B - Amy
数据范围是18位,把每一位加起来的和最多9*18 = 162 所以只需考虑n-162 - n的数即可,暴力解决 #include <iostream> using namespace st ...
- centos6+如何对外开放80,3306端口号或者其他端口号
1.查看防火墙对外开放了哪些端口 [root@hadoop110 ~]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt sour ...
- Tyvj - 1305 单调队列优化dp
今天有点头痛就不写具体细节了,贴完走人 #include<iostream> #include<algorithm> #include<cstdio> #inclu ...
- IOS下去掉input submit圆角和背景色错误
在iOS系统下input submit会有圆角,如果添加有背景色,背景色错误,在安卓系统是没有这些问题,可以在input样式加上这段样式 input{ -webkit-appearance: none ...
- 邮件email
参考地址:https://blog.csdn.net/baidu_30000217/article/details/52942258 邮箱配置地址:http://service.exmail.qq.c ...
- Vue省市区三级联选择器V-Distpicker的使用
Vue省市区三级联选择器V-Distpicker的使用 最近用的Vue+Element UI时,有些地方需要用到省市区三联选择器,网上安装并尝试了多种类似的插件,但都因为无法正常实现或是没有眼缘而弃用 ...
- tgz 文件解压
使用命令:tar zxvf ×××.tgz 即可进行解压 留作备忘
- (转)shell脚本之seq命令
shell脚本之seq命令 原文:http://blog.csdn.net/paoxiaohui/article/details/52830595 seq 用于生成从一个数到另一个数之间的所有整数. ...
- Linux软件安装的补充
1 使用yum 命令查看软件提供的版本 yum list mysql* 然后比如说都需要安装我们就可以执行命令: yum install mysql* 然后就会安装所有的.会显示所有需要安装的包,和需 ...