看了很多Java的模拟笔试题,几乎每套题里都有这么个选择题:Java参数是传值还是传引用。
每次遇到这个选择题我就很郁闷,因为我不明白何为“传值”,何为“传引用”,虽然我确实了解Java参数传递过程中发生了什么。这里我就不因个人的愚来钝混淆视听了,总之,不管是以后这种题以什么形式提出都好,理解Java参数传递过程才是王道。
先看primitive型数据的情况:
- public static void tripleValue(double x) //
- {
- x = 3 * x;
- }
- 。。。
- //call this method
- double percent = 10;
- tripleValue(percent);
- System.out.println("After: percent =" + percent ); // 10
当进入到tripleValue方法中时,x是percent的一个copy,因为percent是primitive的,因此它的copy也是primitive,也就是说x就是一个单纯的值,对这个“值”做操作不会影响方法外面的percent变量的,因此操作完成后percent依然是10。
看object型数据的情况:
- public static void tripleSalary(Employee x)
- {
- x.riseSalary(200);
- }
- 。。。
- Employee harry = new Employee(. . .);
- tripleSalary(harry);
- System.out.println("After: salary=" + harry.getSalary()); // works
执行这段代码时,当进入到tripleValue方法中后,x是harry的一个copy,harry是指向一个Employee对象实例的引用,因此x也是同样的一个引用。此时,通过x调用Employee对象实例的riseSalary方法,可以修改对象实例的salary值,又因为harry也指向同一对象,因此harry.getSalary()所得值也发生了变化。
但是,切记,x仅是harry的一个copy,在对x做任何操作之前,它们之间的唯一联系仅是指向同一对象,但如果在方法中我们改变了x的指向,那么这个变化是不会影响到harry的。
以上就是Java参数传递的过程。那个选择虽然现在也不明白,但是还是说一下通用的答案比较完整:
Java参数是传值嗒~