1. 程式人生 > >java 形參的值傳遞和引用傳遞

java 形參的值傳遞和引用傳遞

分析java 函式引數傳遞的型別.

首先看示例:

//定義一個受測試的類
public static class Value {  
    private String value = "value";  
    public String getValue() { return value; }  
    public void setValue(String value) { this.value = value; }  
}  

//定義對受測試類的 操作方法
public static void newValue(Value value) {  
    value = new Value();  
    value.setValue("new value");  
    System.out.println("In newValue, HashCode = " 
        + value.hashCode() + ", value = " + value.getValue());  
}  

//定義對受測試類的 操作方法 
public static void modifyValue(Value value) {  
    value.setValue("new value");  
    System.out.println("In modifyValue, HashCode = " 
        + value.hashCode() + ", value = " + value.getValue());  
}  


//測試
public static void main(String[] args) {  
    Value value1 = new Value();  
    System.out.println("Before modify, HashCode = " 
        + value1.hashCode() + ", value = " + value1.getValue());  //1.  Before modify, 
                                                //HashCode = 12677476, value = value
    
    // 將value1指向新的Value物件 
    //[分析點1] 
    newValue(value1);  //1.  In newValue, HashCode = 33263331, value = new value
    
    System.out.println("After modify, HashCode = " 
        + value1.hashCode() + ", value = " + value1.getValue() + "\n");  //1.  After modify, 
                                //HashCode = 12677476, value = value
    
    Value value2 = new Value();  
    System.out.println("Before modify, HashCode = " 
        + value2.hashCode() + ", value = " + value2.getValue());//1.  Before modify, HashCode = 6413875, value = value
      
    // 使用object的set方法,修改物件的內部值  
    //[分析點2] 
    modifyValue(value2);  //In modifyValue, HashCode = 6413875, value = new value
    
    System.out.println("After modify, HashCode = " 
        + value2.hashCode() + ", value = " + value2.getValue()); //1.  After modify, HashCode = 6413875, value = new value
     
}  

分析:

[分析點1] 處呼叫下面函式時的引數傳遞分析: 

newValue(value1); //1. In newValue, HashCode = 33263331, value = new value

//定義對受測試類的 操作方法
public static void newValue(Value value) {  

/*

此時 函式內的區域性變數 value引用的是value1,

相當於c語言中 value是一個指向Value型別的一個指標:

Value * value;

而之前new 建立的value1 相當於c語言中:

Value * value1 =  new Value();

value 是在棧記憶體中重新分配的一個指標型變數,該指標指向 value1指向的物件.

*/
    value = new Value();  //重置 value指標,指向一個新的物件, 此時value和value1分別指向不同的物件了.
    value.setValue("new value");  
    System.out.println("In newValue, HashCode = " 
        + value.hashCode() + ", value = " + value.getValue());  
}  

畫圖個草圖:

結論:

有一種說法是當一個物件或引用型別變數被當作引數傳遞時,也是值傳遞,這個值就是物件
的引用,因此JAVA 中只有值傳遞,沒有

引用傳遞

還有一種說法是引用可以看作是物件的
別名,當物件被當作引數傳遞給方法時,傳遞的是物件的引用,因此是引用傳遞 

這種說法只是觀察的角度不同,實質是相同的.

相關推薦

java 傳遞引用傳遞

分析java 函式引數傳遞的型別. 首先看示例: //定義一個受測試的類 public static class Value { private String value = "value"; public String getValue() {

大歐陽在java 實參與還有傳遞引用傳遞之間的理解

一、實參和形參先扯一段程式碼public static void swap(int a,int b) { int tmp = a; a = b; b = tmp; System.out.println("

Java 傳遞引用傳遞

too log test img [0 st3 tle class cnblogs 引用傳遞 示例: public class Test3 { public static void change(int []a){ a

JAVA中的傳遞引用傳遞問題

log 輸出結果 基礎知識 blue static 繼續 oid .net red   這是個老生常談的問題了,引起過無數爭論,但可以說一直沒有一個令人滿意的回答。   有人總結過: 對象是按引用傳遞的 Java 應用程序有且僅有的一種參數傳遞機制,即按值傳遞

java傳遞引用傳遞

public 例子 oar 是什麽 sta light 修改 [] 重要 1:按值傳遞是什麽 指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。示例如下: [java] view plain copy public class TempTest { private

java中的傳遞引用傳遞

raise 兩個 demo1 double class turn style chan reference java 參數,不管是原始類型還是引用類型,傳遞的都是參數的副本。 如果參數類型是原始類型,那麽傳遞的參數是這個參數的一個副本,也就是這個原始參數的值。如果在函數中改

這一次,徹底解決Java傳遞引用傳遞

信息 getter 數據類型 裝載 而已 訪問 實參 數據結構 修改 本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麽實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論

JAVA傳遞引用傳遞

內容 stub generated https ati [1] 數據 details 接收 JAVA值傳遞和引用傳遞 @Author: TianchiLiu 1 值傳遞和引用傳遞 值傳遞: 方法調用時,實際參數把它的值傳遞給對應的形式參數,函數接收的是原始值的一個copy

[精]--這一次,讓你徹底明白Java傳遞引用傳遞

本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麼實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論的話題又是充滿爭議:有的論壇帖子說Java只有值傳遞,有的部落格說兩者皆有;這讓人有點摸不著頭

java面試題02》--傳遞引用傳遞

值傳遞和引用傳遞,近期介面開發中處理結果集等資料的時候常用到,二者主要區別在於所傳的引數型別: public static void main(String[] args) { test(); } public static void test(){ Str

徹底搞懂Java傳遞引用傳遞

學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麼實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論的話題又是充滿爭議:有的論壇帖子說Java只有值傳遞,有的部落格說兩者皆有;這讓人有點摸不著頭腦,下面我們就這個話題做一些探討,對書籍、對論壇

java中的傳遞引用傳遞有什麼區別呀?

  值傳遞:        (形式引數型別是基本資料型別和String):方法呼叫時,實際引數把它的值傳遞給對應的形式引數,形式引數只是用實際引數的值初始化自己的儲存單元內容,是兩個不同的儲存單元,所以方法執行中形式引數值的改變不影響實際引數的值。 引用

java中的傳遞引用傳遞有什麽區別呀?

地址 system main方法 demo ring brush 執行 相關 變量 值傳遞: (形式參數類型是基本數據類型和String):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存

java中的傳遞引用傳遞用法詳解

       值傳遞:方法呼叫時,實際引數把它的值傳遞給對應的形式引數,方法執行中形式引數值的改變不影響實際參 數的值。   引用傳遞:也稱為傳地址。方法呼叫時,實際引數的引用(地址,而不是引數的值)被傳遞給方法中相對應的形式引數,在方法執行中,對形式引數的操作實際上就是對實際引數的

Java基本資料型別以及由不可變類帶來的傳遞引用傳遞的難點分析

一、Java提供的資料型別 Java提供了8中原始的資料型別(byte,short,int,long,float,double,char,boolean),這些資料型別不是物件,相應的變數被定義後會立刻在棧上被分配記憶體空間。除此之外的資料型別,都是引用型別,引用型別在變數

String 不變性以及Java 傳遞引用傳遞

查看 () spa har args sta ogg [] btn String 不變性以及Java 值傳遞和引用傳遞 public class Example { String str = new String("good"); cha

Java 中的傳遞引用傳遞問題

Java 中的值傳遞和引用傳遞問題 public class Operation { int data = 50; void change(int data) { data = data + 100; } public static void main(S

java傳遞引用傳遞的知識點

java中值傳遞和引用傳遞的知識點 直接看下面的截圖和程式碼吧 package com.xuebao; public class ValueAndRef { /** * * @Description: (測試值傳遞和引用傳遞) * @param p

來一次徹底解決Java傳遞引用傳遞

本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麼實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論的話題又是充滿爭議:有的論壇帖子說Java只有值傳遞,有的部落格說兩者皆

Java傳遞引用傳遞

本文旨在用最通俗的語言講述最枯燥的基本知識 學過Java基礎的人都知道:值傳遞和引用傳遞是初次接觸Java時的一個難點,有時候記得了語法卻記不得怎麼實際運用,有時候會的了運用卻解釋不出原理,而且坊間討論的話題又是充滿爭議:有的論壇帖子說Java只有值傳遞,有的部落格說兩者皆