Core Java2 7th 阅读笔记(一)
第四章里面讨论到JAVA的方法参数到底是值传递还是引用传递,?作者认为JAVA使用的是值传递,而在Thinking in JAVA中关于传递貌似说的是引用传递(我有点记不清了,刚才也没翻到),在网上搜了一下,更是说法纷纭,让人越看越迷糊。没办法,只好自己想办法写例子来实验一下。
先构建一个Person类,有name和age两个字段
- 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是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。