java中的方法参数传递机制---值传递

来源:互联网 发布:linux查看指定进程 编辑:程序博客网 时间:2024/06/05 14:34

一直以来,都被java中的参数传递方式都是 — 值传递。被这个说法搞的很糊涂。有时候传过去的值会发生变化,有的又不会,相信初学者会遇到这样的坑。今天就来说为啥会这样?

先来一段代码?

/** * 值传递的演示 * @author hjm * */public class TestDemo {public static void swap(int a,int b) {    //用一个临时变量来存a的值    int temp = a;    a = b;    b = temp;    System.out.println("来自swap方法内的"+a+",和"+b);}public static void main(String[] args) {    int a = 6;    int b = 9;    swap(6,9);    System.out.println("来自swap方法外的"+a+",和"+b);      }}   

看下这两个输出是否一致?

第一个输出是 来自swap方法内的9,和6
第二个输出是 来自swap方法外的6,和9

为什么会出现不一样的结果呢?真相是main方法中调用的swap(6,9);将6,9作为实参传到形参中去,问题就出在这里。传过去的值其实是这俩个值的拷贝。就好比《西游记中》的孙悟空在要干架的时候,都是变出几个假孙悟空跟别人打。 这个也是道理。我传过去的值都是我的替身,你在swap中进行的一番折腾,其实都是改变的我的替身值,我真身没有丝毫变化。于是就出现了两个输出内容不一样的值。

这么写的话不好理解的话,那就看图帮助理解

基本数据类型传值

这图看了之后应该不会有疑惑了?那么这个是基本类型的传值,那么传过去的是个引用类型的呢?那么值会发生变化 吗?

public class TestDemo02 {public static void swap(DataSwap ds) {    int temp = ds.a;    ds.a = ds.b;    ds.b = temp;    System.out.println("来自swap方法内的"+ds.a+",和"+ds.b);}public static void main(String[] args) {    DataSwap ds = new DataSwap();    ds.a = 6;    ds.b = 9;    swap(ds);    System.out.println("来自swap方法外的"+ds.a+",和"+ds.b);}} class DataSwap{//成员变量不用赋初值,但最好还是赋比较好int a;int b;

这个会出现什么情况呢?

来自swap方法内的9,和6
来自swap方法外的9,和6

为什么值会发生变化呢?难道不是用到了值传递的方式吗?
其实,敢肯定的是 他们用到了都是值传递的方式。 记得引用类型的引用变量存的是什么吗?引用变量存的是对象的地址。 所以将引用变量作为参数传过去,其实就是将对象的地址传过去。 这个好比 我将家里的地址告诉你,你去找这个地址,不就找到了我家(这个对象 )。然后你在我家(对象中)的各种操作不就会有影响产生。

看图
引用类型传值示意图

看到这个图,应该就会恍然大悟了吧。
真正明白了,java中的参数传值传值都是采用值传递方式。以后看见了着种情况不会再迷惑了吧。

本篇思路来源于《疯狂java讲义》

我只是大自然的搬运工。

原创粉丝点击