1. 程式人生 > >大歐陽在java 實參與形參還有值傳遞和引用傳遞之間的理解

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

一、實參和形參

先扯一段程式碼

public static void swap(int a,int b) {
	        int tmp = a;
	        a = b;
	        b = tmp;
	        System.out.println("swap方法中,a的值是"+a+",b的值是"+b);
	    }

	    public static void main(String[] args) {
	        int a = 6;
	        int b = 9;
	        swap(a,b); // swap方法中,a的值是9,b的值是6
	        System.out.println("交換結束後,a的值是"+a+",b的值是"+b); // 交換結束後,a的值是6,b的值是9
	        // 傳引數相當於複製,swap中的a、b是複製品
	    }

嗯,就這個,swap(int a,int b)這個裡頭的a,b就是形參,,然後main方法裡頭的a,b就是實參了。那麼問題來了,為啥這樣子呢。下面上專業的解釋:

形參

定義:全稱"形式引數",用於定義方法的時候使用的引數,目的用來接收呼叫該方法時傳遞的引數。

說明:只有在被呼叫時才會分配記憶體單元,在呼叫結束,即刻釋放所分配的記憶體單元。因此,只在方法內才有效。

實參

定義:全稱"實際引數",用於呼叫時傳遞給方法的引數,即傳遞給被呼叫方法的值。

說明:預先建立並賦予確定值。

1、形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數。
2、實參可以是常量、變數、表示式、函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使引數獲得確定值。
3、實參和形參在數量上,型別上、順序上應嚴格一致,否則就會發生型別不匹配的錯誤。
4、在一般傳值呼叫的機制中只能把實參傳送給形參,而不能把形參的值反向地傳送給實參。因此在函式呼叫過程中,形參值發生改變,而實參中的值不會變化。而在引用呼叫的機制當中是將實參引用的地址傳遞給了形參,所以任何發生在形參上的改變實際上也發生在實參變數上。
嗯,大概就是上面解釋的一樣,就這麼回事,嗯,沒毛病,下面是圖解:


嗯,大概就這麼個回事

二、值傳遞和引用傳遞

還是剛那個程式碼

public static void swap(int a,int b) {
	        int tmp = a;
	        a = b;
	        b = tmp;
	        System.out.println("swap方法中,a的值是"+a+",b的值是"+b);
	    }

	    public static void main(String[] args) {
	        int a = 6;
	        int b = 9;
	        swap(a,b); // swap方法中,a的值是9,b的值是6
	        System.out.println("交換結束後,a的值是"+a+",b的值是"+b); // 交換結束後,a的值是6,b的值是9
	        // 傳引數相當於複製,swap中的a、b是複製品
	    }

這個就是值傳遞,就只是傳遞的是值

public class DataWrap {
    int a;
    int b;
}
public class Test{ // 引用傳遞
    public static void swap(DataWrap dw) { // 複製一個dw的引用,指向物件
        int tmp = dw.a;
        dw.a = dw.b;
        dw.b = tmp;
        System.out.println("swap方法中,a的值是"+dw.a+",b的值是"+dw.b);
        dw = null; // 把它殺掉
    }

    public static void main(String[] args) {
        DataWrap dw = new DataWrap();
        dw.a = 6;
        dw.b = 9;
        swap(dw);//swap方法中,a的值是9,b的值是6
        System.out.println("交換結束後,a的值是"+dw.a+",b的值是"+dw.b);//swap方法中,a的值是9,b的值是6
    }
}

這個就是引用傳遞,傳遞的是記憶體地址,記憶體地址所指向的內容如果變了,內容也會跟著變的




相關推薦

歐陽java 參與還有傳遞引用傳遞之間理解

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

Java思考】Java 中的參與之間傳遞到底是傳遞還是引用傳遞呢?

科普: - **值傳遞**(pass by value)是指在呼叫函式時將實際引數複製一份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。 - **引用傳遞**(pass by reference)是指在呼叫函式時將實際引數的地址直接傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實

C# 學習筆記之 參與

學習筆記 ole ews 返回 它的 參數 參與 line 方法 一,形參   聲明是在方法的參數列表中,它的功能是:     ①可以返回一個或多個值給調用代碼;     ②在方法執行的時候就把數據傳入方法; 二,實參   實參位於方法調用的參數列表中,實參的值用來

C語言第56課:參與隨堂實戰

·第56課:實參與形參隨堂實戰 ·例子:計算圖形的面積 #include<stdio.h> #include<stdlib.h> #include<math.h> /* 圓:s = PI * r * r

C++參與

1.實參和形參的區別:形參出現在函式定義的地方,多個形參之間以逗號分隔,形參規定了一個函式所接受資料的型別和數量。實參出現在函式呼叫的地方,實參的數量與型別與形參一樣,實參用於初始化形參。 2.形參和函式體內部定義的變數統稱為區域性變數,僅在函式的作用域內可見,同時區域性變

C函式的參與的輸出區別

#include <stdio.h> int swap(int a,int b) { int temp; temp=a; a=b; b=temp;

參與之間資料傳輸的一些理解(指標指向、儲存位置)

首先我們先通過一題來了解一下實參與形參間值傳遞的方式。例題1:void Getmemory(char *p) { p=(char *)malloc(100); } int main() { char *str=NULL; Getmemory(str);

java 傳遞引用傳遞

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

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

JS中函數數值傳遞引用傳遞

保持 variant 全局變量 都是 tex over family nor -c 也許大家對於函數的參數都不會太在意,簡單來說,把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。深入研究,你會發現其實沒那麽簡單,這個傳參是要分倆種情況(其實這是個

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):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存