java参数引用传递 int java引用类型参数传递 |
您所在的位置:网站首页 › java参数传递是值传递还是引用传递 › java参数引用传递 int 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 小明总结:值传递的时候,将实参的值,复制一份给形参。引用传递的时候,将实参的地址值,复制一份给形参。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |