Java中方法參數傳遞----傳值與傳引用的理解

   最近在看到的一個問題,關於Java中方法參數傳遞時究竟是傳值仍是傳引用;html

   下列java程序的輸出結果爲____。java

public class Example{
    String str=new String("hello");
    char[]ch={'a','b'};
    public static void main(String args[]){
        Example ex=new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str+" and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[]){
        str="test ok";
        ch[0]='c';
    }
}

答案:網站

hello and cb

 Java中參數傳遞的規則是基本數據類型傳值,對象類型傳遞引用。那爲何答案與本身的指望值「test ok and cb」不一樣呢?
spa

1.首先  Java中在進行方法調用是會在內存中進行局部變量的劃分,會在Java棧中push一個叫作棧幀的內存空間。

  內存空間中有兩塊地方,分別用來保存str,ch變量code

2.main 方法   棧幀 ex.str那塊空間會保存傳進來的對象引用0x2AEF(即內容爲「hello」對象實例的內存地址)
   change 方法棧幀 str 那塊空間會保存傳進來的對象引用0x2AEF
3.方法進行到

str="test ok"

  代表 change 方法   棧幀中str那塊空間的內存地址0x2AEF更換爲 內容爲「test ok」實例的內存地址0x2ABC;orm

  然而main方法 棧幀ex.str 那塊內存空間的值不變,依然是0x2AEF。htm

所以 原來main方法中的ex.str 的內容依然不變對象

4.結果,打印

hello and cb
5.分析緣由:

  change 方法中 str變量 保存的是「hello」內存地址,當進行blog

str="test ok"

時,str變量保存的又是「test ok」內存地址。也就是說你進行的操做是引用的替換,而不是對「hello」那一塊空間的實際內容進行操做。內存

那麼如何對傳進來的對象類型的實例 改變其保存的內容了,除非是該類提供了改變內部值的方法

提供參考網站:

http://hxraid.iteye.com/blog/428856

http://www.hollischuang.com/archives/1198

相關文章
相關標籤/搜索