欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java方法參數(shù)傳遞機(jī)制原理解析

 更新時間:2019年12月16日 09:38:55   作者:sumerday  
這篇文章主要介紹了Java方法參數(shù)傳遞機(jī)制原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

這篇文章主要介紹了Java方法參數(shù)傳遞機(jī)制原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

Java方法中如果聲明了形參,在調(diào)用方法時就必須給這些形參指定參數(shù)值,實(shí)際傳進(jìn)去的這個值就叫做實(shí)參。
這就涉及到Java中的參數(shù)傳遞機(jī)制,值傳遞。

基本數(shù)據(jù)類型

基本數(shù)據(jù)類型,值傳遞的體現(xiàn)是數(shù)值的傳遞。

public class TransferTempTest {
  public static void main(String[] args) {
    //基本數(shù)據(jù)類型參數(shù)傳遞
    TransferTempTest test = new TransferTempTest();
    int num1 = 10;
    int num2 = 20;
    System.out.println("進(jìn)行交換前:");
    System.out.println("num1 = " + num1 + ",num2 = " + num2);
    test.swap(num1, num2);
    System.out.println("交換之后:");
    System.out.println("num1 = " + num1 + ",num2 = " + num2);
  }
  public void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    System.out.println("交換過程中:");
    System.out.println("num1 = " + a + ",num2 = " + b);
  }
}
//運(yùn)行結(jié)果
進(jìn)行交換前:
num1 = 10,num2 = 20
交換過程中:
num1 = 20,num2 = 10
交換之后:
num1 = 10,num2 = 20

整個過程的內(nèi)存圖演示:

如圖所示:

  • 在堆內(nèi)存中創(chuàng)建 TransferTempTest類型的對象,假設(shè)此時地址值時0x1177(只是假設(shè)),并讓棧內(nèi)存中的引用變量test存儲0x1177,指向該對象。
  • 在棧內(nèi)存中聲明兩個變量num1和num2,并為他們賦值10和20。這時可以看到打印的結(jié)果為:num1 = 10,num2 = 20
  • 程序繼續(xù)向下,進(jìn)入swap方法,首先在棧區(qū)聲明兩個變量a和b,他們都是形參,這時將num1和num2的值分別傳入,此時如藍(lán)色字體所顯示,a=10,b=20。
  • 接著還是在棧區(qū)聲明一個名為temp的變量,這時執(zhí)行的交換過程是在swap方法中,交換的變量其實(shí)是num1和num2的拷貝值,所以方法內(nèi)打印:num1 = 20,num2 = 10
  • 最后,退出這個方法,局部變量銷毀,發(fā)現(xiàn)其實(shí)一頓操作,原先的值根本就沒有改變,打印結(jié)果和原先一樣:num1 = 10,num2 = 20

引用數(shù)據(jù)類型

基本數(shù)據(jù)類型,值傳遞的體現(xiàn)是地址值的傳遞。

public class TransferTempTest {
  public static void main(String[] args) {
  //引用類型參數(shù)傳遞
    DataTemp data = new DataTemp();
    data.a = 2;
    data.b = 4;
    System.out.println("進(jìn)行交換前:");
    System.out.println("data.a = " + data.a + ",data.b = " + data.b);
    data.swapClass(data);
    System.out.println("進(jìn)行交換后:");
    System.out.println("data.a = " + data.a + ",data.b = " + data.b);
  }
}
class DataTemp {
  int a;
  int b;

  public void swapClass(DataTemp data) {
    int temp = data.a;
    data.a = data.b;
    data.b = temp;
    System.out.println("交換過程中:");
    System.out.println("data.a = " + data.a + ",data.b = " + data.b);

  }
}
//運(yùn)行結(jié)果
進(jìn)行交換前:
data.a = 2,data.b = 4
交換過程中:
data.a = 4,data.b = 2
進(jìn)行交換后:
data.a = 4,data.b = 2

整個過程的內(nèi)存圖顯示:

如圖所示:

  1. 在堆內(nèi)存中創(chuàng)建DataTemp類型的對象,并讓棧內(nèi)存中的引用變量data存儲0x7788(假設(shè)地址值),指向該對象,實(shí)例變量a和b的初始值都是0。
  2. 讓data.a=2,data.b=4,如藍(lán)色字體顯示,這時打?。篸ata.a = 2,data.b = 4
  3. 進(jìn)入swapClass方法,首先在棧區(qū)聲明形參變量data,將原來的data的地址值傳入,紅黑兩個data不是同一個??!,紅色data只是黑色data的拷貝值,且拷貝的是地址值。這時兩個data指向同一片堆區(qū)內(nèi)存,如紅色箭頭顯示。
  4. 接著還是在棧區(qū)聲明一個名為temp的變量,參與交換操作,這時操作的是堆區(qū)的數(shù)據(jù),所以方法里顯然打?。篸ata.a = 4,data.b = 2
  5. 最后,退出這個方法,局部變量銷毀,執(zhí)行的交換過程雖然是在swapClass方法中,但引用變量傳入形參傳遞的是地址值,意味著,這時的交換操作直接對堆區(qū)對象生效,所以最終交換成立:data.a = 4,data.b = 2

綜合練習(xí)

package com.my.pac05;

public class TransferTest {
  public static void main(String[] args) {
    TransferTest test = new TransferTest();
    test.first();
  }

  public void first() {
    int i = 5;
    Value v = new Value();

    v.i = 25;
    second(v, i);
    System.out.println(v.i);
  }

  public void second(Value v, int i) {
    i = 0;
    v.i = 20;
    Value val = new Value();
    v = val;
    System.out.println(v.i + " " + i);
  }
}

class Value {
  int i = 15;
}
//運(yùn)行結(jié)果
15 0
20

整個過程的內(nèi)存圖顯示:

總結(jié)

  • 方法不能修改基本數(shù)據(jù)類型的參數(shù),他們改變的僅僅是他們的拷貝。
  • 方法可以改變對象參數(shù)的狀態(tài),因?yàn)榉椒梢酝ㄟ^對象引用的拷貝修改對象狀態(tài)。
  • 方法不能讓對象參數(shù)引用一個新的對象,方法得到的永遠(yuǎn)都是拷貝值。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java串口通信入門

    Java串口通信入門

    串口通信是一種用于在計算機(jī)和外部設(shè)備之間進(jìn)行數(shù)據(jù)交換的通信方式,本文主要介紹了Java串口通信入門,并提供一個簡單的示例來演示如何在Java中進(jìn)行串口通信,感興趣的可以了解一下
    2023-11-11
  • 關(guān)于spring.factories的常用配置項(xiàng)說明

    關(guān)于spring.factories的常用配置項(xiàng)說明

    這篇文章主要介紹了關(guān)于spring.factories的常用配置項(xiàng)說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • springboot下實(shí)現(xiàn)RedisTemplate?List?清空

    springboot下實(shí)現(xiàn)RedisTemplate?List?清空

    我們經(jīng)常會使用Redis的List數(shù)據(jù)結(jié)構(gòu)來存儲一系列的元素,當(dāng)我們需要清空一個List時,可以使用RedisTemplate來實(shí)現(xiàn),本文就來詳細(xì)的介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2024-01-01
  • Java8中使用一行代碼讀取文件

    Java8中使用一行代碼讀取文件

    這篇文章主要介紹了Java8中使用一行代碼讀取文件,要注意,本文介紹的方法不適合讀取很大的文件,因?yàn)榭赡艽嬖趦?nèi)存空間不足的問題,需要的朋友可以參考下
    2015-03-03
  • Android中Socket通信的實(shí)現(xiàn)方法概述

    Android中Socket通信的實(shí)現(xiàn)方法概述

    這篇文章主要介紹了Android中Socket通信的實(shí)現(xiàn)方法,很有實(shí)用價值,需要的朋友可以參考下
    2014-08-08
  • springboot學(xué)習(xí)之Thymeleaf模板引擎及原理介紹

    springboot學(xué)習(xí)之Thymeleaf模板引擎及原理介紹

    本文主要介紹一下SpringBoot給我們推薦的Thymeleaf模板引擎,這模板引擎呢,是一個高級語言的模板引擎,他的這個語法更簡單而且功能更強(qiáng)大,對springboot?Thymeleaf模板引擎相關(guān)知識感興趣的朋友一起看看吧
    2022-02-02
  • Java的List集合框架之ArrayList詳解

    Java的List集合框架之ArrayList詳解

    這篇文章主要介紹了Java的List集合框架之ArrayList詳解,ArrayList默認(rèn)容量為10(構(gòu)造方法未指定初始容量為0),擴(kuò)容是利用位運(yùn)算(右移一位)和直接相加進(jìn)行1.5倍擴(kuò)容,需要的朋友可以參考下
    2023-11-11
  • 淺談maven的jar包和war包區(qū)別 以及打包方法

    淺談maven的jar包和war包區(qū)別 以及打包方法

    下面小編就為大家分享一篇淺談maven的jar包和war包區(qū)別 以及打包方法,具有很好的參考價值,希望對大家有所幫助
    2017-11-11
  • 詳解Java實(shí)踐之抽象工廠模式

    詳解Java實(shí)踐之抽象工廠模式

    抽象工廠模式用于產(chǎn)品族的構(gòu)建。抽象工廠是所有形態(tài)的工廠模式中最為抽象和最具一般性的一種形態(tài)。抽象工廠是指當(dāng)有多個抽象角色時使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個接口,使客戶端在不必指定產(chǎn)品的具體情況下,創(chuàng)建多個產(chǎn)品族中的產(chǎn)品對象
    2021-06-06
  • 用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM

    用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM

    這篇文章主要介紹了用Spring Native將SpringBoot程序轉(zhuǎn)換為GraalVM的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下
    2021-04-04

最新評論