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

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

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

    Thinker

      - long way to go...

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      24 隨筆 :: 0 文章 :: 143 評(píng)論 :: 0 Trackbacks
    先給出兩個(gè)例子引出今天所要討論的問(wèn)題:
     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 

    考慮一下上面這段代碼的輸出結(jié)果是什么?
    我相信絕大多數(shù)人都能快速的給出正確答案:
    value1: aaa
    value2: bbb
    Person - Name: 張三, Age: 20
    Person - Name: 李四, Age: 30
    答案為什么是這樣的呢?那么 Java 到底是按值傳遞還是按引用傳遞參數(shù)的呢?
    例子1中的 swapValue() 方法不起作用,看起來(lái)是按值傳遞參數(shù)的,例子2中的 changeName() 和 changeAge() 方法起作用,從表面上看起來(lái)好像又是按引用傳遞參數(shù)的。呵呵,別急,先讓我們來(lái)弄清楚一個(gè)重要的概念,就是 Java 操縱對(duì)象都是通過(guò)引用來(lái)實(shí)現(xiàn)的,所有的對(duì)象變量都是所指向的對(duì)象的引用,那也就是說(shuō)所有對(duì)象變量的值并不是它所指向的對(duì)象本身,而是該對(duì)象的引用,這句話(huà)聽(tīng)起來(lái)可能有點(diǎn)讓人犯暈,舉個(gè)例子來(lái)說(shuō),String str = new String("aaa"); 這條語(yǔ)句的意思是 new 了一個(gè)值為 "aaa" 的字符串對(duì)象,然后用一個(gè)名字叫 str 的對(duì)象變量來(lái)指向它,保存它的引用,假設(shè)在內(nèi)存中 new 出來(lái)的這個(gè)字符串對(duì)象的實(shí)際地址為 0xA242, 那么 str 的值實(shí)際上是 0xA242。
    現(xiàn)在來(lái)看看例子1,假設(shè)
    String value1 = "value1: aaa" 的地址為 0xA242,
    String value2 = "value2: bbb" 的地址為 0xA24B,
    然我們來(lái)看看 swapValue(value1, value2); 語(yǔ)句 Java 是怎么執(zhí)行的。當(dāng)程序執(zhí)行到這句語(yǔ)句的時(shí)候,JVM 在棧中創(chuàng)建兩個(gè)臨時(shí)變量 tmpValue1,tmpValue2,用來(lái)接收傳進(jìn)來(lái)的 value1 和 value2 的值,而 value1 和 value2 的值分別為 0xA242 和 0xA24B,所以那兩個(gè)臨時(shí)變量 tmpValue1和tmpValue2 的值也被賦值為 0xA242 和 0xA24B,此時(shí)接下來(lái)的三條語(yǔ)句分別是
    tempStr = 0xA242,
    tmpValue1 = 0xA24B,
    tmpValue2 = 0xA242;
    此時(shí) tmpValue1 的值是指向 "value2: bbb" 這個(gè)對(duì)象的,
       tmpValue2 的值是指向 "value1: aaa" 這個(gè)對(duì)象,你可以在 swapValue() 方法內(nèi)部打印 tmpValue1 和 tmpValue2 的值驗(yàn)證一下。
    不過(guò)這里的 tmpValue1和tmpValue2 是在棧中的臨時(shí)變量,而并不是 main 方法中 value1和value2,main 方法中 value1和value2 的值并沒(méi)有改變,那這里所謂的值傳遞是指什么呢?因?yàn)?value1 的值是 0xA242("value1: aaa" 這個(gè)對(duì)象的引用),而并不是 "value1: aaa" 這個(gè)對(duì)象,傳遞參數(shù)時(shí)傳遞的是 "value1: aaa" 這個(gè)對(duì)象的引用也就是 value1 的值,所以是值傳遞。
    例子2也是一樣的,假設(shè)
    Person person = new Person("張三", 20) 的地址為 0xA242,
    那么 person 的值是 0xA242, 那么通過(guò)調(diào)用 changePerson(person); 將 0xA242 傳遞給 tmpPerson, 也就是 tmpPerson 此時(shí)的值為 0xA242 也就是 new Person("張三", 20) 這個(gè)對(duì)象的引用,也就是說(shuō) tmpPerson 指向 new Person("張三", 20) 對(duì)象,對(duì) tmpPerson 引用對(duì)象的修改實(shí)際上就是對(duì) person 引用對(duì)象的修改,這看起來(lái)很想引用傳遞的概念,但實(shí)際上是值傳遞,為什么呢?因?yàn)樵趨?shù)傳遞過(guò)程中傳遞的是 person 的值,也就是 0xA242。
    呵呵,好好體會(huì)吧。
    歡迎來(lái)信指正錯(cuò)誤。

    http://www.tkk7.com/qujinlong123/
    posted on 2007-04-16 19:52 Long 閱讀(9026) 評(píng)論(18)  編輯  收藏 所屬分類(lèi): Java

    評(píng)論

    # re: Java 是值傳遞還是引用傳遞? 2007-04-16 19:59 劉甘泉
    老問(wèn)題了,T.I.J里面也有詳細(xì)的解釋  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-04-17 10:16 嘎嘎
    java傳的是對(duì)象引用的地址??  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-04-17 12:18 Long
    @嘎嘎
    對(duì)于對(duì)象來(lái)說(shuō),java 傳的是對(duì)象的引用  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-04-17 13:18 ice4x
    對(duì)于值類(lèi)型來(lái)說(shuō),傳遞的就是值,對(duì)于對(duì)象,傳遞的就是對(duì)象的引用。  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-04-18 13:30 靜兒
    本來(lái)覺(jué)得是很簡(jiǎn)單的問(wèn)題 。經(jīng)閣下一講解,發(fā)現(xiàn)自己原來(lái)真的有點(diǎn)概念不清。謝謝了!  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-05-17 23:37 Jerry Tao
    簡(jiǎn)單的說(shuō),Java 只有值傳遞。  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-05-18 00:32 Long
    @Jerry Tao
    不錯(cuò),Java是只有值傳遞,但是這個(gè)“值”是別有深意的,而且也經(jīng)常會(huì)困擾初學(xué)者的。  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-05-26 00:21 天涯客
    樓主的例子上當(dāng)然還涉及到一個(gè)問(wèn)題:因?yàn)镾tring是Imutable的  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-05-26 00:22 天涯客
    樓主的例子上當(dāng)然還涉及到一個(gè)問(wèn)題:因?yàn)镾tring是Immutable的   回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-05-26 00:40 Long
    @天涯客
    至于Java對(duì)String對(duì)象本身的管理對(duì)傳遞參數(shù)來(lái)說(shuō)是無(wú)關(guān)系的,無(wú)論String是不是Immutable,它都是一個(gè)對(duì)象,對(duì)象的傳遞方式都是一樣的。  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2007-07-02 16:42 青松
    java是值傳遞.

    只不過(guò)對(duì)象的引用是和對(duì)象是遙控器與電視的關(guān)系.遙控器和電視都沒(méi)有變.
    變的只是節(jié)目  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2010-06-21 10:48 ne_akari
    這帖子居然在搜索第一頁(yè),害人不淺啊。  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2010-06-21 10:55 ne_akari
    這個(gè)例子根本沒(méi)有任何說(shuō)服力,可以看出,博主本身并沒(méi)有理解這個(gè)問(wèn)題。
    第一個(gè)String沒(méi)有改變值可以說(shuō)明,在這個(gè)例子中是值傳遞。
    而第二個(gè)Person屬性的值的改變,是示例方法里使用的是引用的形式來(lái)改變屬性的,與對(duì)象本身的調(diào)用是值傳遞或者引用傳遞沒(méi)有任何關(guān)系。
    人們總是很輕易地相信一個(gè)事實(shí),總是很輕易地得到一個(gè)結(jié)論,而不去考慮更多。
    什么是值傳遞,什么是引用傳遞,這個(gè)定義你搞清楚了嗎?
    好好思考下吧,或者好好GOOGLE下吧,難道引用地址就不可以再被復(fù)制一份嗎?你沒(méi)想到的,有可能正是答案的所在。  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞?[未登錄](méi) 2010-07-13 12:14 java
    @ne_akari
    亂七八糟的SB回復(fù)  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2011-02-10 17:39 tone
    tempStr = 0xA242,
    tmpValue1 = 0xA24B,
    tmpValue2 = 0xA242

    你寫(xiě)的是什么,tmpValue1 和 tmpValue2 傳的不都是引用??
    因?yàn)樗麄兪莟mp臨時(shí)的對(duì)象 然后接收了引用了

    但是又要記住你這不是new出來(lái)的,是常量池中的數(shù)據(jù)所以,改變不了

    而且
    值參數(shù)傳遞那么, 等號(hào)= 左邊的變量肯定是開(kāi)辟一個(gè)新的地址(物理內(nèi)存),然后把等號(hào)右邊的地址中的內(nèi)容弄過(guò)來(lái),弄過(guò)來(lái)的是內(nèi)容!

    而引用傳遞, 就是 等號(hào)= 左邊的就是一個(gè)地址(類(lèi)似指針),然后把等號(hào)右邊的地址給弄過(guò)來(lái)

      回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2011-02-10 17:44 tone
    @tone
    我QQ669112773 你來(lái)找我  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2011-02-10 18:31 tone
    對(duì)象也是引用傳遞啊

    和數(shù)組一樣 數(shù)組名 傳的是它的首地址 引用傳遞
    而后面的 元素或者說(shuō)屬性 的傳遞 是值傳遞  回復(fù)  更多評(píng)論
      

    # re: Java 是值傳遞還是引用傳遞? 2011-05-23 10:19
    樓主本來(lái)就有理解錯(cuò)誤,JAVA本來(lái)就是用值傳遞.第一個(gè)就是典型的值傳遞,值傳遞是開(kāi)辟一個(gè)新內(nèi)存把原變量來(lái)指向的值復(fù)制過(guò)來(lái)...回去看一下值傳遞和引用傳遞概念再發(fā)文章吧,不要在這里誤導(dǎo)人  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 久久国产精品亚洲一区二区| fc2免费人成在线| 亚洲成AV人片一区二区| 日本免费中文字幕在线看| 免费视频成人片在线观看| 污视频网站在线免费看| 亚洲人成7777| 亚洲欧洲精品国产区| 精品亚洲永久免费精品| 亚洲男人av香蕉爽爽爽爽| 日本大片在线看黄a∨免费| 亚洲黄色免费观看| 久章草在线精品视频免费观看| 九九久久国产精品免费热6| 亚洲av无码日韩av无码网站冲| 久久精品国产亚洲av麻豆蜜芽| 亚洲午夜视频在线观看| 亚洲人成无码网站久久99热国产| 午夜成年女人毛片免费观看| 日本成年免费网站| 最近在线2018视频免费观看| 在线看片免费人成视频播| 你好老叔电影观看免费| 国产精品免费看久久久香蕉| 亚洲视频在线免费| 永久免费无码日韩视频| 免费人人潮人人爽一区二区| 日韩欧美亚洲中文乱码| 亚洲国产成人手机在线观看| 亚洲AV无码一区二区三区网址| 亚洲午夜无码久久久久软件| 在线精品亚洲一区二区| 亚洲色偷偷色噜噜狠狠99| 亚洲三级高清免费| 亚洲综合精品伊人久久| 亚洲综合激情五月色一区| 亚洲av日韩综合一区二区三区| 亚洲高清乱码午夜电影网| 九九精品国产亚洲AV日韩| 老妇激情毛片免费| 一区二区免费在线观看|