7.5 参数传递

函数调用的时候,我们说把值传入参数,例如函数max(5,4),把5和4两个整数传入了参数,然后max函数进行计算。下面我们来看看这个例子:
public static void main(String[]args){
    int m=10;
    changeTo5(m);
    System.out.println(m);
}
public static void changeTo5(int a){
    a=5;
    System.out.println("a="+a);
}
changeTo5函数有参数a,它的功能是把a的值改成5。
我们可以看到在changeTo5内部的打印,参数a是改了的,然而在main函数再打印,m的值没有换。 到底发生了什么?
这是因为m的值传入changeTo5的时候,是复制了一个值然后分别赋值给参数a,然后对a的操作,实际上不会影响到本尊m。就好像你复制了一个文件给你朋友,他改了文件对你的原文件一点影响都没有。这就是值传递。传进去的只是一个副本
有没有办法让参数不使用副本呢?因为Java没有指针、没有引用类型,所以没有办法。对于java来说,changeTo5这个函数是无法实现的。 基本变量类型例如int、double 、long、char这类参数都是值传递的,无法改变。
和值传递对应的是引用传递。 对于不是基本变量类型的参数,例如数组、或者某个类的对象,就不是值传递了。这类参数函数是直接操作参数,并不是副本!我们看看这个例子。
public static void main(String[]args){
    int array[]={6};
    change(array);
    System.out.println(array[0]);
}
public static void change(int[]arr){
    arr[0]=5;
}
array是一个数组,只有一个元素,值是6,而函数change接受一个数组参数,它修改了参数第一个元素的值为5。我们在main函数中调用了change,然后打印array第一个元素,打印的结果是5。说明这个种情况下,函数对参数的修改生效了
总结起来就是两句话:
1.基本数据类型和String作为函数的参数,采用的是值传递,是复制一个副本,函数对参数的修改影响不了原来的变量。
2.数组、自定义的类的对象作为参数,采用的是引用传递,函数可以修改这类参数的值。