47 public static void swapValue(String tmpValue1, String tmpValue2) {
48 String tempStr = tmpValue1;
49 tmpValue1 = tmpValue2;
50 tmpValue2 = tempStr;
51 }
52
53 public static void changePerson(Person tmpPerson) {
54 tmpPerson.changeName("李四");
55 tmpPerson.changeAge(30);
56 }
57 }
58
考虑一下上面这段代码的输出结果是什么?
我相信绝大多数人都能快速的给出正确答案:
value1: aaa
value2: bbb
Person - Name: 张三, Age: 20
Person - Name: 李四, Age: 30
答案为什么是这样的呢?那么 Java 到底是按值传递还是按引用传递参数的呢?
例 子1中的 swapValue() 方法不起作用,看起来是按值传递参数的,例子2中的 changeName() 和 changeAge() 方法起作用,从表面上看起来好像又是按引用传递参数的。呵呵,别急,先让我们来弄清楚一个重要的概念,就是 Java 操纵对象都是通过引用来实现的,所有的对象变量都是所指向的对象的引用,那也就是说所有对象变量的值并不是它所指向的对象本身,而是该对象的引用,这句话听起来可能有点让人犯晕,举个例子来说,String str = new String("aaa"); 这条语句的意思是 new 了一个值为 "aaa" 的字符串对象,然后用一个名字叫 str 的对象变量来指向它,保存它的引用,假设在内存中 new 出来的这个字符串对象的实际地址为 0xA242, 那么 str 的值实际上是 0xA242。