第四章里面讨论到JAVA的方法参数到底是值传递还是引用传递, 作者认为JAVA使用的是值传递,而在Thinking in JAVA中关于传递貌似说的是引用传递(我有点记不清了,刚才也没翻到),在网上搜了一下,更是说法纷纭,让人越看越迷糊。没办法,只好自己想办法写例子来实验一下。
先构建一个Person类,有name和age两个字段
java 代码
- public class Person ...{
- String name;
- int age;
- public Person(String name,int age)...{
- this.name = name;
- this.age = age;
- }
- public int getAge() ...{
- return age;
- }
- public void setAge(int age) ...{
- this.age = age;
- }
- public String getName() ...{
- return name;
- }
- public void setName(String name) ...{
- this.name = name;
- }
- }
然后再设计一个personSwap方法,传入两个Person对象引用,先对这两个对象引用进行对象交换操作,然后再对两个对象中的name字段值进行交换操作。最后,在main中调用方法。最后生成的结果我都写在了注释中
java 代码
- public class PersonUtil ...{
- public static void personSwap(Person a, Person b) ...{
- /**
- * 传入的对象引用,这里指向的对象和在传入前的是一样的
- * 打印结果
- * ------------------swapbegin------------------
- * Person a:Person@11b86e7 name:aaa age:1
- * Person b:Person@35ce36 name:bbb age:2
- */
- System.out.println("------------------swap begin------------------");
- System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
- + a.getAge());
- System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
- + b.getAge());
- System.out.println();
- /**
- * 开始交换对象
- * 打印结果
- * ------------------swap reference------------------
- * Person a:Person@35ce36 name:bbb age:2
- * Person b:Person@11b86e7 name:aaa age:1
- */
- System.out
- .println("------------------swap reference------------------");
- Person tmp1 = a;
- a = b;
- b = tmp1;
- System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
- + a.getAge());
- System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
- + b.getAge());
- System.out.println();
- /**
- * 交换对象中name字段的值
- * 打印结果
- * ------------------swap field value------------------
- * Person a:Person@35ce36 name:aaa age:2
- * Person b:Person@11b86e7 name:bbb age:1
- */
- System.out
- .println("------------------swap field value------------------");
- String tmp2 = a.getName();
- a.setName(b.getName());
- b.setName(tmp2);
- System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
- + a.getAge());
- System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
- + b.getAge());
- System.out.println();
- /**
- * 交换完成后
- * 打印结果
- * ------------------swap end------------------
- * Persona:Person@35ce36 name:aaa age:2
- * Person b:Person@11b86e7 name:bbb age:1
- */
- System.out.println("------------------swap end------------------");
- System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
- + a.getAge());
- System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
- + b.getAge());
- System.out.println();
- }
- public static void main(String[] args) ...{
- Person a = new Person("aaa", 1);
- Person b = new Person("bbb", 2);
- /**
- * 生成两个对象,对象引用为a、b
- * 在交换前的初始数据
- * 打印结果
- * ------------------before swap------------------
- * Person a:Person@11b86e7 name:aaa age:1
- * Person b:Person@35ce36 name:bbb age:2
- */
- System.out.println("------------------before swap------------------");
- System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
- + a.getAge());
- System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
- + b.getAge());
- System.out.println();
- PersonUtil.personSwap(a, b); // 调用方法,进入方法体
- /**
- * 方法调用结束,返回main() 打印结果
- * ------------------after swap------------------
- * Person a:Person@11b86e7 name:bbb age:1
- * Person b:Person@35ce36 name:aaa age:2
- */
- System.out.println("------------------after swap------------------");
- System.out.println("Person a:" + a + " name:" + a.getName() + " age:"
- + a.getAge());
- System.out.println("Person b:" + b + " name:" + b.getName() + " age:"
- + b.getAge());
- }
- }
其结果很明显,java的对象引用传递并不是直接把引用传递进去的,否则,在离开personSwap方法后,a和b所指向的对象应该对调了才是。应该说,core java2所说的传递引用拷贝是正确的,换言之,JAVA是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。