java参数引用传递 int java引用类型参数传递

您所在的位置:网站首页 java参数传递是值传递还是引用传递 java参数引用传递 int java引用类型参数传递

java参数引用传递 int java引用类型参数传递

2023-06-17 22:49| 来源: 网络整理| 查看: 265

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 小明总结:值传递的时候,将实参的值,复制一份给形参。引用传递的时候,将实参的地址值,复制一份给形参。

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3