黑马程序员_方法的值传递和引用传递浅析

------- android培训java培训、期待与您交流! ----------

看如下代码1:

       public class Demo {

    public static void main(String[] args) {

       int a=1,b=9;

       System.out.println("调用前:a="+a+" b="+b);

       change(a,b);

       System.out.println("调用后:a="+a+" b="+b);

    }

    public static void change(int a,int b){

       a=a^b;

       b=a^b;

       a=a^b;

       System.out.println("方法内:a="+a+" b="+b);

    }

}

运行结果:

调用前:a=1 b=9

方法内:a=9 b=1

调用后:a=1 b=9

对于很多初学者来说,都会被类似于此的参数传递的问题难住吧,我是在听完基础班老师的讲解后才完全弄明白的。

方法的参数传递有两种:值传递和引用传递-----------(注意栈内存和堆内存的数据存储)

       基本数据类型的数据存储在栈内存中,引用数据类型的数据存储在堆内存中。

       (1)方法的值传递:方法的形参如果是基本数据类型,

       ·                                将值复制,传递到方法内部

                                          在方法内部如果更改值,不影响原值

       (2)方法的按引用传递:方法的形参如果是引用类型

                                          将“引用(即堆内存中的地址值)”复制,传递到方法内部

                                          此时原引用和方法内部的引用都指向同一块在堆中的空间

                                          如果在方法内部通过引用将堆中的值更改,原引用所获取的值将同时发生更改

将上面的代码修改一下

代码2:

public class Demo {

    public static void main(String[] args) {

       int[] arr={0,1};

       System.out.println("arr[0]="+arr[0]+" arr[1]="+arr[1]);

       change(arr);

    }

    public static void change(int[] arr){

       arr[0]=arr[0]^arr[1];

       arr[1]=arr[0]^arr[1];

       arr[0]=arr[0]^arr[1];

       System.out.println("方法内:arr[0]="+arr[0]+" arr[1]="+arr[1]);

    }

}

运行结果:

调用前:arr[0]=0 arr[1]=1

方法内:arr[0]=1 arr[1]=0

调用后:arr[0]=1 arr[1]=0

    看代码1,传递给形参的数据是基本数据类型,将值复制赋给change(inta,int b)中的a和b,

a和b是change(inta,int b)内部的局部变量,他们的改变不影响主函数里的a,b值。

    代码2传递给形参的是数组arr[]的内存地址,他们指向的都是堆内存里的同一块内存空间,当里面的值发生改变时,只要是这个数组的引用,都会受到影响。



你可能感兴趣的:(java学习日志)