读书人

Core Java2 7th 阅览笔记(一)

发布时间: 2012-11-03 10:57:42 作者: rapoo

Core Java2 7th 阅读笔记(一)

第四章里面讨论到JAVA的方法参数到底是值传递还是引用传递,?作者认为JAVA使用的是值传递,而在Thinking in JAVA中关于传递貌似说的是引用传递(我有点记不清了,刚才也没翻到),在网上搜了一下,更是说法纷纭,让人越看越迷糊。没办法,只好自己想办法写例子来实验一下。

先构建一个Person类,有name和age两个字段

    1. public?class?PersonUtil?...{ ??
    2. ??
    3. ????public?static?void?personSwap(Person?a,?Person?b)?...{ ??
    4. ????????/**?
    5. ?????????*?传入的对象引用,这里指向的对象和在传入前的是一样的? ?
    6. ?????????*?打印结果 ?
    7. ?????????*?------------------swapbegin------------------? ?
    8. ?????????*?Person?a:Person@11b86e7?name:aaa?age:1? ?
    9. ?????????*?Person?b:Person@35ce36?name:bbb?age:2 ?
    10. ?????????*/??
    11. ????????System.out.println("------------------swap?begin------------------"); ??
    12. ????????System.out.println("Person?a:"?+?a?+?"?name:"?+?a.getName()?+?"?age:"??
    13. ????????????????+?a.getAge()); ??
    14. ????????System.out.println("Person?b:"?+?b?+?"?name:"?+?b.getName()?+?"?age:"??
    15. ????????????????+?b.getAge()); ??
    16. ????????System.out.println(); ??
    17. ??
    18. ????????/**??
    19. ?????????*?开始交换对象? ?
    20. ?????????*?打印结果 ?
    21. ?????????*?------------------swap?reference------------------ ?
    22. ?????????*??Person?a:Person@35ce36?name:bbb?age:2? ?
    23. ?????????*??Person?b:Person@11b86e7?name:aaa?age:1 ?
    24. ?????????*/??
    25. ????????System.out ??
    26. ????????????????.println("------------------swap?reference------------------"); ??
    27. ????????Person?tmp1?=?a; ??
    28. ????????a?=?b; ??
    29. ????????b?=?tmp1; ??
    30. ????????System.out.println("Person?a:"?+?a?+?"?name:"?+?a.getName()?+?"?age:"??
    31. ????????????????+?a.getAge()); ??
    32. ????????System.out.println("Person?b:"?+?b?+?"?name:"?+?b.getName()?+?"?age:"??
    33. ????????????????+?b.getAge()); ??
    34. ????????System.out.println(); ??
    35. ???????? ??
    36. ????????/**??
    37. ?????????*?交换对象中name字段的值? ?
    38. ?????????*?打印结果? ?
    39. ?????????*?------------------swap?field?value------------------? ?
    40. ?????????*?Person?a:Person@35ce36?name:aaa?age:2? ?
    41. ?????????*?Person?b:Person@11b86e7?name:bbb?age:1 ?
    42. ?????????*/??
    43. ????????System.out ??
    44. ????????????????.println("------------------swap?field?value------------------"); ??
    45. ????????String?tmp2?=?a.getName(); ??
    46. ????????a.setName(b.getName()); ??
    47. ????????b.setName(tmp2); ??
    48. ????????System.out.println("Person?a:"?+?a?+?"?name:"?+?a.getName()?+?"?age:"??
    49. ????????????????+?a.getAge()); ??
    50. ????????System.out.println("Person?b:"?+?b?+?"?name:"?+?b.getName()?+?"?age:"??
    51. ????????????????+?b.getAge()); ??
    52. ????????System.out.println(); ??
    53. ???????? ??
    54. ????????/**??
    55. ?????????*?交换完成后? ?
    56. ?????????*?打印结果? ?
    57. ?????????*?------------------swap?end------------------ ?
    58. ?????????*?Persona:Person@35ce36?name:aaa?age:2? ?
    59. ?????????*?Person?b:Person@11b86e7?name:bbb?age:1 ?
    60. ?????????*/??
    61. ????????System.out.println("------------------swap?end------------------"); ??
    62. ????????System.out.println("Person?a:"?+?a?+?"?name:"?+?a.getName()?+?"?age:"??
    63. ????????????????+?a.getAge()); ??
    64. ????????System.out.println("Person?b:"?+?b?+?"?name:"?+?b.getName()?+?"?age:"??
    65. ????????????????+?b.getAge()); ??
    66. ????????System.out.println(); ??
    67. ????} ??
    68. ??
    69. ????public?static?void?main(String[]?args)?...{ ??
    70. ????????Person?a?=?new?Person("aaa",?1); ??
    71. ????????Person?b?=?new?Person("bbb",?2); ??
    72. ??
    73. ????????/**??
    74. ?????????*?生成两个对象,对象引用为a、b? ?
    75. ?????????*?在交换前的初始数据? ?
    76. ?????????*?打印结果 ?
    77. ?????????*?------------------before?swap------------------? ?
    78. ?????????*?Person?a:Person@11b86e7?name:aaa?age:1? ?
    79. ?????????*?Person?b:Person@35ce36?name:bbb?age:2 ?
    80. ?????????*/??
    81. ????????System.out.println("------------------before?swap------------------"); ??
    82. ????????System.out.println("Person?a:"?+?a?+?"?name:"?+?a.getName()?+?"?age:"??
    83. ????????????????+?a.getAge()); ??
    84. ????????System.out.println("Person?b:"?+?b?+?"?name:"?+?b.getName()?+?"?age:"??
    85. ????????????????+?b.getAge()); ??
    86. ????????System.out.println(); ??
    87. ??
    88. ????????PersonUtil.personSwap(a,?b);?//?调用方法,进入方法体 ??
    89. ??
    90. ????????/**??
    91. ?????????*?方法调用结束,返回main()?打印结果? ?
    92. ?????????*?------------------after?swap------------------ ?
    93. ?????????*?Person?a:Person@11b86e7?name:bbb?age:1? ?
    94. ?????????*?Person?b:Person@35ce36?name:aaa?age:2 ?
    95. ?????????*/??
    96. ????????System.out.println("------------------after?swap------------------"); ??
    97. ????????System.out.println("Person?a:"?+?a?+?"?name:"?+?a.getName()?+?"?age:"??
    98. ????????????????+?a.getAge()); ??
    99. ????????System.out.println("Person?b:"?+?b?+?"?name:"?+?b.getName()?+?"?age:"??
    100. ????????????????+?b.getAge()); ??
    101. ????} ??
    102. ??
    103. } ??

    其结果很明显,java的对象引用传递并不是直接把引用传递进去的,否则,在离开personSwap方法后,a和b所指向的对象应该对调了才是。应该说,core java2所说的传递引用拷贝是正确的,换言之,JAVA是传值的,它把整一个对象传了进去,因此我们可以对该对象的字段进行操作,但是我们不能改变对象引用所指的对象。

读书人网 >其他相关

热点推荐