JAVA基础之方法参数传递

时间:2021-10-31 16:47:22

Java方法中参数的调用,到底是值传递还是引用传递

  • 我在Java核心艺术一书中阅读到这个点,解开了困扰我多年的疑惑。
    首先说下方法参数传递都有哪些
    • call by value 按值传递
    • call by reference按引用调用
    • call by name 按名称调用
    • ···
  • 以上是程序语言方法调用的方式,在这里我可以很明确的告诉大家:
    Java程序设计语言总是按值调用
  • 解析
  • 方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量内容。
  • 案例

    • 基本数据类型参数
      double percent = 10;
      tripleValue(percent );

      public static void tripleValue(double x){
      x = x *3;
      }

    执行这个程序你会发现,无论怎么样percent的值都不会改变,然后我们拆解一下执行过程:
    1)x被初始化,值为percent的值拷贝
    2 )x倍乘以3后,值为30,但是percent的值不变
    3)这个方法结束后,参数变量x不在被使用。JAVA基础之方法参数传递

    • 引用数据类型
      public statuc void tripleSalary(Employee x){
      x.setSalary(200);
      }

      Employee harry = new Employee();
      tripleSalary(harry);

    具体执行过程:
    1) x被初始化为harry值的拷贝,这里指的是一个对象的引用的拷贝
    2) setSalary方法引用于这个对象的引用,x和harry指向同一块实例区域的值被改变
    3)方法结束后,参数变量x不在使用,harry继续引用并指向被修改的实例区域JAVA基础之方法参数传递

到此,就有人疑问了,不是说好的,java总是值传递吗,刚才怎么说是拷贝了引用,是不是前后矛盾,我只能说是值传递,引用也是拷贝的引用值,在看下一个例子,你的疑问就没了。

  • 例子3,引用对象,引用修改

    public static void swap(Employee x,Employee y){
    Employee temp = x;
    x=y;
    y=temp;
    }

    Employee a=new Employee("alice",...);
    Employee b=new Employee("bob",...);
    swap(a,b);

    如果按照,之前的猜想,引用传递,引用赋值,那么这里就可以对引用进行修改,在赋值。事实上并非如此,看图,无需多做解释。。。
    JAVA基础之方法参数传递