专业术语:
- 调用:方法参数的传递方式。
- 值调用:方法接收的是调用者提供的值。
- 引用调用:方法接收的是调用者提供的变量地址。
Java总是采用值调用:
- 基本数据类型:
public class Main { public static void reset(int value) { value = 0; } public static void main(String[] args) { int value = 100; System.out.println(value); reset(value); System.out.println(value); } }
reset方法没有改变value的值,属于值调用。
- 对象引用:
class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return name; } } public class Main { public static void changeName(Person person, String name) { person.setName(name); } public static void main(String[] args) { Person jason = new Person(); jason.setName("Jason"); System.out.println(jason); changeName(jason, "LiZhixiang"); System.out.println(jason); } }
第一次输出:Jason
第二次输出:LiZhixiang
这并不能说明对象引用进行的是引用调用。
对象引用进行的是值调用,方法得到的是对象引用的拷贝,此时对象引用与它的所有拷贝引用同一个对象。
swap方法并没有任何作用。class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return name; } } public class Main { public static void swap(Person p1, Person p2) { Person tmp = p1; p1 = p2; p2 = tmp; } public static void main(String[] args) { Person p1 = new Person(); p1.setName("Alice"); Person p2 = new Person(); p2.setName("Bob"); System.out.println(p1 + " " + p2); swap(p1, p2); System.out.println(p1 + " " + p2); } }
因此,对象引用进行的也是值调用。