JAVA 值传递与引用传递的几种情况

Java中数据类型分为基本数据类型和引用数据类型,方法的参数分为实际参数,和形式参数。

  • 形式参数:定义方法时写的参数。
  • 实际参数:调用方法时写的具体数值。

一般情况下,在数据做为参数传递的时候,基本数据类型是值传递,引用数据类型是引用传递(地址传递)。

一.值传递

 1     public static void main(String[] args) {
 2         int a = 2;
 3         int b = 3;
 4         change(a,b);
 5         System.out.println("a = " + a);
 6         System.out.println("b = " + b);
 7     }
 8     public static void change(int a1,int b1) {
 9         a1++;10         b1++;11         System.out.println("a = " + a1);
12         System.out.println("b = " + b1);    
13     }

运行结果:

1 a = 3
2 b = 4
3 a = 2
4 b = 3

流程:

1.主函数进栈,a、b初始化;

2.调用change方法,change()进栈,将a和b的值,复制一份给a1和b1;

3.change方法中对a1和b1进行运算;

4.change方法弹栈;

5.主函数弹栈;

原因分析:

在change方法中,对a1和b1进行赋值,并不会影响到a、b,因为a1、b1中的值,只是从a、b中复制过来的,也就是a1、b1相当于a、b的副本,副本的内容无论怎么修改,都不会影响到原件本身。

二.引用传递

1 public static void main(String[] args) {
2     int[] a = {1, 2, 3, 4, 5};
3     change(a);
4     System.out.println(a[0]);
5 }
6 public static void change(int[] array) {
7     array[0] = 0;
8     System.out.println(array[0]);
9 }

运行结果

1 0
2 0

流程:

1.主函数进栈,int[] a初始化;

2.调用change方法,change()进栈,将a的地址值,复制一份给array;

3.change方法中,根据地址值,找到堆中的数组,并将第一个元素的值改为0。

4.change方法运行完毕,数组中第一个元素的值已经改变。

5.change方法弹栈;

6.主函数弹栈;

原因分析:

调用change()方法时,形参array接收的是a地址值的副本。并在change方法中,通过地址值,对数组进行操作。change方法弹栈后,数组中的值已经改变。无论是主函数,还是change方法,操作的都是同一地址值对应的数组。

三.String类型传递

1 public static void main(String[] args) {
2     String a = "123";
3     change(a);
4     System.out.println(a);
5 }
6 public static void change(String a1) {
7     a1 = "321";
8     System.out.println(a1);
9 }

运行结果是:

1 321
2 123

流程:

1.主函数进栈,a初始化;

2.调用change方法,change()进栈,将a的地址值,复制一份给a1;

3.change方法中,重新创建了一个String对象"321",并将a1指向了新的地址值;

4.change方法运行完毕,a1所指向的地址值已经改变;

5.change方法弹栈;

6.主函数弹栈;

原因分析:

String对象做为参数传递时,走的依然是引用传递,只不过String这个类比较特殊。

String对象一旦创建,内容不可更改。每一次内容的更改都是重现创建出来的新对象。

当change方法执行完毕时,a1所指向的地址值已经改变。而a1本来的地址值就是copy过来的副本,所以并不能改变a的值。

与String类型类似的情况

 1 public class Test3 {
 2 
 3     public static void main(String[] args) {
 4         Person p = new Person("小明");
 5         change(p);
 6         System.out.println(p.name);
 7     }
 8     public static void change(Person p1) {
 9         Person person = new Person("小红");
10         p1 = person; 
11         System.out.println(p1.name);   
12     }
13 }
14 class Person {
15     String name;
16     public Person(String name) {
17         this.name = name;
18     }
19 }

运行结果为:

1 小红
2 小明

总结:

  • 值传递的时候,将实参的值,复制一份给形参。
  • 引用传递的时候,将实参的地址值,复制一份给形参。

猜你喜欢

转载自www.cnblogs.com/wyc1991/p/9060411.html
今日推荐