最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入解析Java編程中方法的參數(shù)傳遞

 更新時間:2015年10月23日 15:37:00   作者:mingli198611  
這篇文章主要介紹了Java編程中方法的參數(shù)傳遞,是Java入門學習中的基礎知識,需要的朋友可以參考下

在閱讀本文之前,根據(jù)自己的經(jīng)驗和理解,大家可以先思考并選擇一下Java函數(shù)的參數(shù)傳遞方式:
A. 是按值傳遞的?
B. 按引用傳遞的?
C. 部分按值部分按引用?
此處暫不宣布正確答案,我們通過一個簡單的例子讓大家自己找答案:
1. 先定義一個類型Value

public static class Value { 
  private String value = "value"; 
  public String getValue() { return value; } 
  public void setValue(String value) { this.value = value; } 
} 

2. 寫兩個函數(shù)newValue和modifyValue:newValue會將入?yún)⒅赶蛞粋€新的對象,modifyValue會調(diào)用入?yún)⒌膕etValue方法修改對象的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()); 
} 

3. 簡單的測試代碼

public static void main(String[] args) { 
  Value value1 = new Value(); 
  System.out.println("Before modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue()); 
  // 將value1指向新的Value對象 
  newValue(value1); 
  System.out.println("After modify, HashCode = " + value1.hashCode() + ", value = " + value1.getValue() + "\n"); 
  Value value2 = new Value(); 
  System.out.println("Before modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue()); 
  // 使用object的set方法,修改對象的內(nèi)部值 
  modifyValue(value2); 
  System.out.println("After modify, HashCode = " + value2.hashCode() + ", value = " + value2.getValue()); 
} 

4. 執(zhí)行結(jié)果日志:

Before modify, HashCode = 12677476, value = value 
In newValue, HashCode = 33263331, value = new value 
After modify, HashCode = 12677476, value = value 
 
Before modify, HashCode = 6413875, value = value 
In modifyValue, HashCode = 6413875, value = new value 
After modify, HashCode = 6413875, value = new value 


5. 結(jié)果分析:
上述代碼這是非常常見的一種編程模式:在外圍定義|保存|獲取一個值或?qū)ο?,將這個對象作為參數(shù)傳入一個方法,在方法中修改對象的屬性、行為。但兩個方法newValue和modifyValue的修改方式不一樣,在方法調(diào)用之后,該對象在外圍看來也有很大的差別!如何理解這種差異呢?先溫故一下按值傳遞、按引用傳遞的概念:
* 按值傳遞意味著當將一個參數(shù)傳遞給一個函數(shù)時,函數(shù)接收的是原始值的一個副本。因此,如果函數(shù)修改了該參數(shù),僅改變副本,而原始值保持不變。
* 按引用傳遞意味著當將一個參數(shù)傳遞給一個函數(shù)時,函數(shù)接收的是原始值的內(nèi)存地址,而不是值的副本。因此,如果函數(shù)修改了該參數(shù),參數(shù)的原始值(函數(shù)塊之外的調(diào)用代碼中)也隨之改變。
正確的答案:A——Java函數(shù)是按值傳遞參數(shù)的!
分析一下日志:
* 第一段日志輸出,value1參數(shù)在newValue方法內(nèi)部被改為指向新對象,并輸出了新對象的hashCode和value值,但跳出newValue方法域之后,在main方法中的value1沒有發(fā)生任何變化,這符合按值傳遞的定義和特點;如果是按引用傳遞,value1在調(diào)用newValue(Value value)方法之后,應該是發(fā)生變化的。
* 第二段日志輸出,value2在modifyValue方法內(nèi)部進行了setValue操作,hashCode不變而value被修改,離開modifyValue方法域之后,在main方法中value2確實發(fā)生了變更。使用過C++的人容易將這種現(xiàn)象理解為:按引用傳遞函數(shù)參數(shù)!因為這跟C++中的按引用傳遞像極了!但這里恰恰是最容易陷入誤區(qū)的地方!
兩段日志的不同現(xiàn)象背后所隱藏的是原理是:Java語言是按值傳遞參數(shù),按引用傳遞對象的;Java中所操作的對象其實都是操作對象的引用,object本身保存在“堆”中,而對象的“引用“保存在寄存器或“?!敝?。
偽代碼描述一下newValue方法和modifyValue方法的不同之處:

newValue{ 
  Value_ref2 = value_ref1;  // 按值傳入引用value_ref1,得到value_ref1的副本 
  value_obj2 = new Value();  // value_obj2被創(chuàng)建、初始化在“堆“中 
  value_ref2 -> value_obj2;  // value_ref2 指向value_obj2 
value_ref2 ->value_obj2.setValue(“xxx”); // value_obj2 的value被修改 
printValueObj2();      // 此處打印的是obj2的值 
} 
modifyValue{ 
  Value_ref2 = value_ref1;  // 按值傳入引用value_ref1,得到value_ref1的副本 
value_ref2 ->value_obj1.setValue(“xxx”); // value_obj1 的value被修改 
printValueObj1();      // 此處打印的是obj1的值 
} 

夠清楚了吧!value1_ref1在作為參數(shù)傳入函數(shù)的時候,首先被復制了一份副本value1_ref2供函數(shù)域使用,此時這兩個ref都是指向同一個value_obj; newObject函數(shù)中的代碼[ value = new Value(); ] 其實是將value1_ref1指向了一個新的對象value_obj2;在這之后的set操作都是對新對象的操作;modifyValue函數(shù)是通過set方法直接操作value_obj1,這是跟newValue函數(shù)的不同之處。

通過值傳遞參數(shù)
調(diào)用一個方法時候需要提供參數(shù),你必須按照參數(shù)列表指定的順序提供。
例如,下面的方法連續(xù)n次打印一個消息:

public static void nPrintln(String message, int n) {
 for (int i = 0; i < n; i++)
  System.out.println(message);
}

示例
下面的例子演示按值傳遞的效果。
該程序創(chuàng)建一個方法,該方法用于交換兩個變量。

public class TestPassByValue {

  public static void main(String[] args) {
   int num1 = 1;
   int num2 = 2;

   System.out.println("Before swap method, num1 is " +
             num1 + " and num2 is " + num2);

   // 調(diào)用swap方法
   swap(num1, num2);
   System.out.println("After swap method, num1 is " +
             num1 + " and num2 is " + num2);
  }
  /** 交換兩個變量的方法 */
  public static void swap(int n1, int n2) {
   System.out.println("\tInside the swap method");
   System.out.println("\t\tBefore swapping n1 is " + n1
              + " n2 is " + n2);
   // 交換 n1 與 n2的值
   int temp = n1;
   n1 = n2;
   n2 = temp;

   System.out.println("\t\tAfter swapping n1 is " + n1
              + " n2 is " + n2);
  }
}

以上實例編譯運行結(jié)果如下:

Before swap method, num1 is 1 and num2 is 2
    Inside the swap method
        Before swapping n1 is 1 n2 is 2
        After swapping n1 is 2 n2 is 1
After swap method, num1 is 1 and num2 is 2

傳遞兩個參數(shù)調(diào)用swap方法。有趣的是,方法被調(diào)用后,實參的值并沒有改變。

相關文章

  • 詳解Java中PriorityQueue的作用和源碼實現(xiàn)

    詳解Java中PriorityQueue的作用和源碼實現(xiàn)

    這篇文章主要為大家詳細介紹了Java中阻塞隊列PriorityQueue的作用和源碼實現(xiàn)的相關知識,文中的示例代碼講解詳細,需要的小伙伴可以了解下
    2024-02-02
  • Servlet生命周期與工作原理詳解

    Servlet生命周期與工作原理詳解

    這篇文章主要為大家詳細介紹了Servlet生命周期與工作原理的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • 解讀Spring-Context的作用及用法

    解讀Spring-Context的作用及用法

    這篇文章主要介紹了Spring-Context的作用及用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Java 數(shù)據(jù)結(jié)構(gòu)線性表之順序存儲詳解原理

    Java 數(shù)據(jù)結(jié)構(gòu)線性表之順序存儲詳解原理

    線性表的順序存儲是指用一組地址連續(xù)的存儲單元依次存儲線性表中的各個元素、使得線性表中在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲在相鄰的物理存儲單元中,即通過數(shù)據(jù)元素物理存儲的相鄰關系來反映數(shù)據(jù)元素之間邏輯上的相鄰關系
    2021-10-10
  • Maven的概述及基本使用示例詳解

    Maven的概述及基本使用示例詳解

    MApache Maven是一個項目管理和構(gòu)建工具,它基于項目對象模型POM的概念,通過一小段描述信息來管理項目的構(gòu)建、報告和文檔,aven是專門用于管理和構(gòu)建Java項目的工具,本文給大家介紹Maven的概述及基本使用,感興趣的朋友一起看看吧
    2023-07-07
  • spring集成redis cluster詳解

    spring集成redis cluster詳解

    這篇文章主要介紹了spring集成redis cluster詳解,分享了maven依賴,Spring配置,增加connect-redis.properties 配置文件等相關內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Mockito mock Kotlin Object類方法報錯解決方法

    Mockito mock Kotlin Object類方法報錯解決方法

    這篇文章主要介紹了Mockito mock Kotlin Object類方法報錯解決方法,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • mybatis?foreach?屬性及其三種使用情況詳解

    mybatis?foreach?屬性及其三種使用情況詳解

    這篇文章主要介紹了mybatis?foreach?屬性及其三種使用情況詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 實例解析Java日期格式工具類DateUtil.java

    實例解析Java日期格式工具類DateUtil.java

    本文主要對Java日期格式工具類DateUtil.java進行實例解析。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 搭建 springboot selenium 網(wǎng)頁文件轉(zhuǎn)圖片環(huán)境的詳細教程

    搭建 springboot selenium 網(wǎng)頁文件轉(zhuǎn)圖片環(huán)境的詳細教程

    這篇文章主要介紹了搭建 springboot selenium 網(wǎng)頁文件轉(zhuǎn)圖片環(huán)境,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08

最新評論

共和县| 邓州市| 玛曲县| 江源县| 韶关市| 陇西县| 洛南县| 九寨沟县| 姜堰市| 青川县| 台江县| 庆云县| 林口县| 额尔古纳市| 肥东县| 清河县| 陆河县| 信丰县| 温宿县| 苍溪县| 东辽县| 钟山县| 新河县| 民乐县| 固始县| 鲜城| 兴国县| 兰州市| 安达市| 堆龙德庆县| 陈巴尔虎旗| 密山市| 汝南县| 革吉县| 松阳县| 北海市| 峨眉山市| 庐江县| 岳阳市| 公安县| 郴州市|