zoukankan      html  css  js  c++  java
  • 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 小明

    总结:

    • 值传递的时候,将实参的值,复制一份给形参。
    • 引用传递的时候,将实参的地址值,复制一份给形参。
  • 相关阅读:
    【zZ】OpenCV HOGDescriptor 参数图解
    [C]遍历目录下所有文件
    drawing
    转:基于用户投票的排名算法系列
    编码格式
    泛型
    接口
    隐藏方法不能实现多态性
    结构
    静态
  • 原文地址:https://www.cnblogs.com/wyc1991/p/9060411.html
Copyright © 2011-2022 走看看