<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    Java by value or by reference

    Refer to: http://m.tkk7.com/qujinlong123/archive/2007/04/16/111060.html

    先給出兩個例子引出今天所要討論的問題:

     1 
     2 public class Person
     3 {
     4   private String name = null;
     5   private int age = 0;
     6 
     7   public Person(String name, int age) {
     8     this.name = name;
     9     this.age = age;
    10   }
    11 
    12   public void changeName(String newName) {
    13     this.name = newName;
    14   }
    15 
    16   public void changeAge(int newAge) {
    17     this.age = newAge;
    18   }
    19 
    20   public String toString() {
    21     return "Person - Name: " + name + ", Age: " + age;
    22   }
    23 }
    24 
    25 public class PassByValue
    26 {
    27   public static void main(String[] args) {
    28     // one example
    29     String value1 = "value1: aaa";
    30     String value2 = "value2: bbb";
    31 
    32     swapValue(value1, value2);
    33 
    34     System.out.println(value1);
    35     System.out.println(value2);
    36 
    37     // another example
    38     Person person = new Person("張三"20);
    39 
    40     System.out.println(person.toString());
    41 
    42     changePerson(person);
    43 
    44     System.out.println(person.toString());
    45   }
    46 
    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。
    現在來看看例子1,假設 
    String value1 = "value1: aaa" 的地址為 0xA242,
    String value2 = "value2: bbb" 的地址為 0xA24B, 
    然我們來看看 swapValue(value1, value2); 語句 Java 是怎么執行的。當程序執行到這句語句的時候,JVM 在棧中創建兩個臨時變量 tmpValue1,tmpValue2,用來接收傳進來的 value1 和 value2 的值,而 value1 和 value2 的值分別為 0xA242 和 0xA24B,所以那兩個臨時變量 tmpValue1和tmpValue2 的值也被賦值為 0xA242 和 0xA24B,此時接下來的三條語句分別是 
    tempStr = 0xA242, 
    tmpValue1 = 0xA24B, 
    tmpValue2 = 0xA242; 
    此時 tmpValue1 的值是指向 "value2: bbb" 這個對象的,
       tmpValue2 的值是指向 "value1: aaa" 這個對象,你可以在 swapValue() 方法內部打印 tmpValue1 和 tmpValue2 的值驗證一下。
    不過這里的 tmpValue1和tmpValue2 是在棧中的臨時變量,而并不是 main 方法中 value1和value2,main 方法中 value1和value2 的值并沒有改變,那這里所謂的值傳遞是指什么呢?因為 value1 的值是 0xA242("value1: aaa" 這個對象的引用),而并不是 "value1: aaa" 這個對象,傳遞參數時傳遞的是 "value1: aaa" 這個對象的引用也就是 value1 的值,所以是值傳遞。
    例子2也是一樣的,假設
    Person person = new Person("張三", 20) 的地址為 0xA242,
    那么 person 的值是 0xA242, 那么通過調用 changePerson(person); 將 0xA242 傳遞給 tmpPerson, 也就是 tmpPerson 此時的值為 0xA242 也就是 new Person("張三", 20) 這個對象的引用,也就是說 tmpPerson 指向 new Person("張三", 20) 對象,對 tmpPerson 引用對象的修改實際上就是對 person 引用對象的修改,這看起來很想引用傳遞的概念,但實際上是值傳遞,為什么呢?因為在參數傳遞過程中傳遞的是 person 的值,也就是 0xA242。

    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2013-02-01 11:20 Chan Chen 閱讀(210) 評論(0)  編輯  收藏 所屬分類: Scala / Java

    主站蜘蛛池模板: 免费精品国产自产拍在 | 七色永久性tv网站免费看| 亚洲A∨午夜成人片精品网站| 韩国免费一级成人毛片| 亚洲精品国产专区91在线| 国产精品怡红院永久免费| 亚洲一区二区三区精品视频| 男女超爽视频免费播放| 最近2019免费中文字幕6| 亚洲国产精品日韩| 一级视频在线免费观看| 国产偷国产偷亚洲清高动态图| 国产精品永久免费视频| 国产亚洲精品一品区99热| 免费视频一区二区| 亚洲视频中文字幕在线| 免费看韩国黄a片在线观看| 亚洲中文字幕无码av| 国产hs免费高清在线观看| yellow视频免费在线观看| 久久亚洲伊人中字综合精品| 6080午夜一级毛片免费看| 亚洲一卡2卡3卡4卡5卡6卡| 国产婷婷高清在线观看免费| 久久精品无码专区免费| 久久精品国产亚洲av影院| 成人免费无码大片A毛片抽搐色欲 成人免费无码大片a毛片 | 亚洲精品午夜久久久伊人| 天天摸天天操免费播放小视频 | 青青青免费国产在线视频小草| 亚洲综合精品成人| 亚洲真人日本在线| 精品无码AV无码免费专区| 亚洲精华国产精华精华液| 亚洲精品制服丝袜四区| 日韩免费精品视频| 人成免费在线视频| 亚洲黄网站wwwwww| 亚洲国产精品尤物yw在线| 久久精品国产免费观看三人同眠| 爱情岛论坛亚洲品质自拍视频网站 |