歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java值傳遞與引用傳遞

Java值傳遞與引用傳遞

日期:2017/3/1 11:10:16   编辑:Linux編程

Java面試題:

當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?

答案基本上是:值傳遞

說明:得出這種結論的前提必須是“參數的值就是對該對象的引用,而不是對象的內容”

----------------------------------------------------

值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法中執行形式參數值的改變不影響實際參數的值。

引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(即地址,而不是參數的值)被傳遞給方法中相對應的形式參數,

在方法中執行對形式參數的操作實際上就是對實際參數的操作(地址操作),這樣方法執行中形式參數值的改變將會影響實際參數的值。


值傳遞——基本數據類型作為參數(如:String,int)

  1. public static void changeInt(int a, int b){
  2. int tmp;
  3. tmp = a;
  4. a = b;
  5. b = tmp;
  6. }
參數調用:
  1. // int類型,值傳遞
  2. int a = 123;
  3. int b = 456;
  4. printInt(a, b);
  5. changeInt(a, b);
  6. printInt(a, b);
執行結果:

a = 123; b = 456
a = 123; b = 456
----------------------------------------------------

引用傳遞——對象或數組作為參數(如:Person,Array)

  1. class Person{
  2. String name;
  3. int age;
  4. public Person(String name, int age){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. public void changePerson(Person person, String name, int age){
  9. person.name = name;
  10. person.age = age;
  11. }
  12. public void printPerson(Person person){
  13. System.out.println("name = " + person.name + "; age = " + person.age);
  14. }
  15. }
參數調用:
  1. // 對象,引用傳遞
  2. Person p = new Person("張三", 20);
  3. p.printPerson(p);
  4. p.changePerson(p, "李四", 30);
  5. p.printPerson(p);
執行結果:
name = 張三; age = 20
name = 李四; age = 30

----------------------------------------------------

完整示例:

  1. package com.val_ref;
  2. // Person類
  3. class Person{
  4. String name;
  5. int age;
  6. public Person(String name, int age){
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public void changePerson(Person person, String name, int age){
  11. person.name = name;
  12. person.age = age;
  13. }
  14. public void printPerson(Person person){
  15. System.out.println("name = " + person.name + "; age = " + person.age);
  16. }
  17. }
  18. class iArray{
  19. public iArray(){
  20. }
  21. public void reverseArray(int []array){
  22. int tmp;
  23. int len = array.length;
  24. for(int i=0; i<len/2; i++){
  25. tmp = array[i];
  26. array[i]= array[len-1-i];
  27. array[len-1-i] = tmp;
  28. }
  29. }
  30. public void printArray(int []array){
  31. for(int i=0; i<array.length; i++){
  32. System.out.print(array[i] + " ");
  33. }
  34. System.out.println();
  35. }
  36. }
  37. public class testValue {
  38. public static void main(String []args){
  39. // 對象,引用傳遞
  40. Person p = new Person("張三", 20);
  41. p.printPerson(p);
  42. p.changePerson(p, "李四", 30);
  43. p.printPerson(p);
  44. // 對象,引用傳遞
  45. int []array = new int[5];
  46. for(int i=0; i<array.length; i++){
  47. array[i] = i+1;
  48. }
  49. iArray obj = new iArray();
  50. obj.printArray(array);
  51. obj.reverseArray(array);
  52. obj.printArray(array);
  53. // String類型,值傳遞
  54. String name1 = "張三";
  55. String name2 = "李四";
  56. printString(name1, name2);
  57. changeString(name1, name2);
  58. printString(name1, name2);
  59. // int類型,值傳遞
  60. int a = 123;
  61. int b = 456;
  62. printInt(a, b);
  63. changeInt(a, b);
  64. printInt(a, b);
  65. }
  66. // String類型
  67. public static void changeString(String name1, String name2){
  68. String tmpName;
  69. tmpName = name1;
  70. name1 = name2;
  71. name2 = tmpName;
  72. }
  73. public static void printString(String name1, String name2){
  74. System.out.println("name1 = " + name1 + "; name2 = " + name2);
  75. }
  76. // int類型
  77. public static void changeInt(int a, int b){
  78. int tmp;
  79. tmp = a;
  80. a = b;
  81. b = tmp;
  82. }
  83. public static void printInt(int a, int b){
  84. System.out.println("a = " + a + "; b = " + b);
  85. }
  86. }

執行結果:
name = 張三; age = 20
name = 李四; age = 30
1 2 3 4 5
5 4 3 2 1
name1 = 張三; name2 = 李四
name1 = 張三; name2 = 李四
a = 123; b = 456
a = 123; b = 456
Copyright © Linux教程網 All Rights Reserved