1. 程式人生 > >java方法間傳值方式

java方法間傳值方式

以前看一道面試題說: java的傳值方式只能是值傳遞,不會傳遞引用。

後來和朋友討論題目時遇到傳遞的是基本資料型別和非基本資料型別時存在差別。

引數為基本資料型別:

public void swap(StringBuffer a, StringBuffer b) {

		StringBuffer c = a;

		a = b;

		b = c;

		System.out.println("swap: a=" + a + ",b=" + b);

	}

	public static void main(String[] args) {

		StringBuffer a = new StringBuffer("a");

		StringBuffer b = new StringBuffer("b");
		Java傳值 demo2 = new Java傳值();
		demo2.swap(a, b);
		System.out.println("main: a=" + a + ",b=" + b);
	}

輸出:

swap: a=b,b=a
main: a=a,b=b

上面的程式碼想通過swap互動a和b的值,在swap內部,變數a和b已經交換成功了,但在main中a和b的值依然是原來的值.

再看引數為引用的情況:

public void swap(StringBuffer a, StringBuffer b) {

		StringBuffer c = a;

		a = b;

		b = c;

		System.out.println("swap: a=" + a + ",b=" + b);

	}

	public static void main(String[] args) {

		StringBuffer a = new StringBuffer("a");

		StringBuffer b = new StringBuffer("b");

		Java傳值 demo2 = new Java傳值();

		demo2.swap(a, b);

		System.out.println("main: a=" + a + ",b=" + b);

	}
輸出:
swap: a=b,b=a
main: a=a,b=b

和引數為基本型別的情況結果是一致的.
為什麼會出現這種情況呢?

我們來分析下上面的引數傳遞過程,以Demo2為例:

圖1是swap未計算前的引數值,

圖2是swap計算後的引數值.

從圖中可以看出,swap的計算過程只能改變swap內部變數a和b的值,不能改變main中的a和b變數的引用值,換言之,引數的傳遞只能傳值,不存在傳引用一說.



請注意,上面我說不能改變a和b變數的引用值,可沒說不能改變a和b指向的物件的值.再看下面的例子:

public void swap(StringBuffer a, StringBuffer b) {
		a.append(b);
		StringBuffer c = a;
		a = b;
		b = c;

		System.out.println("swap: a=" + a + ",b=" + b);
	}

	public static void main(String[] args) {

		StringBuffer a = new StringBuffer("a");

		StringBuffer b = new StringBuffer("b");

		Java傳值 demo3 = new Java傳值();

		demo3.swap(a, b);

		System.out.println("main: a=" + a + ",b=" + b);

	}
輸出:
swap: a=b,b=ab
main: a=ab,b=b

這個就是上面所說的,在swap內部的計算過程中,改變了main.a所指向物件的值.

就像下面的圖所描述的那樣:

但根本上,swap不能改變main中a和b的引用值.

另外貼一句sun公司官方文件上的描述這一問題的原話:

Java is always pass-by-value.when object is passed as a argument, be careful with that it is also the copy of reference

所以,現在你應該知道,java傳遞的只會是值,沒有傳遞引用.


相關推薦

java方法方式

以前看一道面試題說: java的傳值方式只能是值傳遞,不會傳遞引用。 後來和朋友討論題目時遇到傳遞的是基本資料型別和非基本資料型別時存在差別。 引數為基本資料型別: public void swap(StringBuffer a, StringBuffer b) {

java方法方式

java方法對於簡單資料型別傳值,對類等複雜資料型別傳引用(地址) 但當方法中對傳入引數變數完全改變時,java方法的行為會表現得像傳值,因為完全改變值時,對方法中的區域性變數新劃分了記憶體塊並指向。

java】的方式

運行 有意義 class new main 一個人 結果 參數傳遞 傳遞參數 【java】的傳值方式 當你問大多數程序員Java是傳值還是傳引用的時候,你可能會得到兩種答案之一: (1)Java傳遞原始類型數據時使用的是傳值方式;傳遞對象時則使用傳引用方式;Str

純前端,html頁面方式

純前端,html頁面間傳值方式: 1、使用window.location的href屬性,等於重新重新整理頁面,必須是get請求,post請求需要服務端解析,post是用來客戶端服務端傳遞資料 window.location.href=”b.html?valus=parm”; 傳值端 window.loca

總結java方法(函式)引用的問題

java方法中傳值和傳引用的問題是個基本問題,但是也有很多人一時弄不清。 (一)基本資料型別:傳值,方法不會改變實參的值。 public class TestFun { public static void testInt(int i){    i=5;    }  public static void m

窗口的幾種方法

sdn 架構設計 基本 popu 問題 剛才 text src 界面 剛開始學Winform的同學基本上都會遇到窗口傳值的問題,怎樣解決問題,事實上就是須要解決你對窗口的一個理解。 一定要記住,窗口(Form),它是一個類(Class)。!

Activity方式

官方 serializa 例如 代碼 nds creat ont fin idg 原文地址:https://blog.csdn.net/qq_33748378/article/details/53023036 Activity間的跳轉: 要了解Activity間的傳值,

vue程式中元件方式

vue程式在元件中進行傳值有多種方式,這裡記錄我在專案中使用到的三種: 1. 父元件向子元件傳值 2. 子元件向父元件傳值 3. 通過路由傳參 父元件通過props向子元件傳值 在子元件script中宣告所要接收的引數名稱以及型別 props: { deliv

理解JAVA方式

作者:黑伯 問題: Java的引數傳遞的是值還是引用? 我們經常會被問到這樣的問題,當我呼叫某個方法時,通過引數傳遞過去的是變數本身,還是一個變數的複製品?問題的答案留到討論後給出。 首先,你需要了解下java變數的分類:java中的變數分為 基本型別 介面型別 類型別 陣列型別 其中後

JAVASCRIPT實現的WEB頁面跳轉以及頁面方法

除了form表單提交之外的方法 1.跳轉到新頁面,並且是在新視窗中開啟時: function gogogo() { //do someghing here... window.open("target.html"); } window是一個ja

React Native 父元件和子元件的幾種方式

在React Native的開發中,父子元件和兄弟元件存在關聯關係的場景很常見,對這些場景做一個總結筆記。 1,兄弟元件:所謂兄弟元件,就是說同一個頁面,有兩個元件,元件A,元件B,元件A的狀態的變化,可以導致元件B的狀態變化。 有兩種方式。第一種,在頁面內定義一個Sta

iOS頁面幾種方式

傳值方法 屬性 方法 代理 block 通知 單例 頁面間傳值有八大傳值方式,下面我就簡單介紹下頁面間常用的傳值方式,但對於每種方式的詳細介紹由於內容很多,我會把每種方式單獨列出作為一篇文章詳細介紹,本文不做詳細說明 屬性傳值 第二個介面(Det

Asp.net WebForm頁面方法

一、使用Querystring  Querystring是一種非常簡單的傳值方式,其缺點就是會把要傳送的值顯示在瀏覽器的位址列中,並且在此方法中不能夠傳遞物件。如果你想傳遞一個安全性不是那麼太重要或者是一個簡單的數值時,用此方法最好不過了。下面通過一個小例子來完成傳值工作,步

頁面與頁面的幾種方法

問題 因最近嘗試實現客戶端與服務端分離,服務端只提供介面,客戶端用html+js實現,分成兩個獨立的專案部署,因專案是個人專案,客戶端展示不考慮使用像Angular、Vue、Native這種前端框架實現,於是全部使用靜態頁面實現,請求資料用ajax,在開發的過程中,就遇到了頁面之間傳值的問題。 解決方

java前後臺之間的幾種方式

原文地址:http://blog.sina.com.cn/s/blog_13066bce70102wi1w.html           作者:EasonWang 自己寫的程式碼太少,有時候前後臺傳值還寫的不是很熟練,現在總結一下,加深下印象。 1.jquery的Aja

asp.netWebForm頁面方法

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><script type="text/

ASP.NET之5種全域性變數!頁面方法!

之一: 1. 使用QueryString變數   QueryString是一種非常簡單的傳值方式,他可以將傳送的值顯示在瀏覽器的位址列中。如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時,可以使用這個方法。但是對於傳遞陣列或物件的話,就不能用這個方法了。下面是一個例子:   a.aspx的C#程式

不同頁面的幾種方法

1、url傳值 function getUrlParam(name) { var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|

請寫出在ASP.NET中常用的幾種頁面方法,並說出它們的特點。

QueryString 傳遞一個或多個安全性要求不高或是結構簡單的數值。但是對於傳遞陣列或物件的話,就不能用這個方法了  session(viewstate) 簡單,但易丟失 作用於使用者個人,過量的儲存會導致伺服器記憶體資源的耗盡。   application 物件的作用範

C# 窗體

pen 父窗體 public end cor art sender btn gre Form1: 父窗體, Form2: 子窗體。 1.父窗體接收子窗體的返回值: public partial class Form1: Form { pri