今天主要说一下Java中的参数的问题,在此做一个总结。

首先解释一下两种专业术语。按值传递:表示方法接收的是实参变量的值,而引用传递是指方法接收的是实参变量的地址。那么Java到底是引用传递还是值传递呢?在这里先思考一段代码。

public class Test {
    public static void main(String[] args) {
        int i = 10;
        String name = "小猪猪";
        int[] arr = new int[]{1, 2, 3, 4};
        Person p = new Person();
        p.number = 1;
        System.out.println("改变前i = " + i + ",name=" + name + ",arr:" + Arrays.toString(arr) + ",p.1=" + p.i);
        change(i, name, arr, p);
        System.out.println("改变后i = " + i + ",name=" + name + ",arr:" + Arrays.toString(arr) + ",p.1=" + p.i);
    }

    public static void change(int num, String newName, int[] array, Person person) {
        num = 20;
        newName = new String("大猪猪");
        array[0] = 5;
        person.number = 20;
        System.out.println("改变中i = " + num + ",name=" + string + ",arr:" + Arrays.toString(array) + ",p.1=" + person.number);
    }
}
class Person {
    public int number;
}

结果是多少呢?
改变前i = 10,name=小猪猪,arr:[1, 2, 3, 4],p.1=1
改变中i = 20,name=大猪猪,arr:[5, 2, 3, 4],p.1=20
改变后i = 10,name=小猪猪,arr:[5, 2, 3, 4],p.1=20

直接说结论吧,Java中参数传递就是值传递,也就是说方法得到的是所有实参的一个副本,所以方法不能改变任何实参的内容。

1.对于基本数据类型的实参:byte、short、int、long、float、double、char、boolean,进入方法体中,就会克隆一个变量,和实参的值一样,都是数值,你在方法体中再怎么变化,而实参的值也不会变。例如上面代码对整型i 变量的改变,最终没有改变i 的值。

2.对于引用数据类型的实参:比如String,数组,对象变量,进入方法体中,就会克隆一个对象变量,和实参的值一样,都是地址,则这个新对象变量的引用和实参的引用一致,则你通过对象.属性的方式就可以修改实参对象的属性,例如上面代码对Person类型的对象变量p的属性number进行改变,就可以改变。但是,最重要的是:方法不能让一个对象参数引用一个新的对象,例如String类型的name而言,进入方法体中,就会被赋值一份给一个新的变量newName,指向相同的字符串,但是如果此时将newName指向新的字符串"大猪猪"时,原有的name(也就是实参)还是指向原有的字符串"小猪猪",并没有改变。

java 参数通用转义方法_java 参数通用转义方法


因此总结一下方法参数能做什么?什么不能做?

1.不能修改基本数据类型的实参

2.可以修改对象变量参数的属性

3.不能让原有的对象变量引用新的对象