91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中類型傳遞與引用傳遞的區別是什么

發布時間:2021-02-11 13:37:07 來源:億速云 閱讀:181 作者:Leah 欄目:編程語言

本篇文章給大家分享的是有關java中類型傳遞與引用傳遞的區別是什么,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

java中方法參數傳遞方式是按值傳遞。
如果參數是基本類型,傳遞的是基本類型的字面量值的拷貝。
如果參數是引用類型,傳遞的是該參量所引用的對象在堆中地址值的拷貝。

java的值傳遞和引用傳遞在面試中一般都會都被涉及到,今天我們就來聊聊這個問題,首先我們必須認識到這個問題一般是相對函數而言的,也就是java中的方法參數,那么我們先來回顧一下在程序設計語言中有關參數傳遞給方法(或函數)的兩個專業術語:

按值調用(call by value)

按引用調用(call by reference)

所謂的按值調用表示方法接收的是調用著提供的值,而按引用調用則表示方法接收的是調用者提供的變量地址(如果是C語言的話來說就是指針啦,當然java并沒有指針的概念)。這里我們需要注意的是一個方法可以修改傳遞引用所對應的變量值,而不能修改傳遞值調用所對應的變量值,這句話相當重要,這是按值調用與引用調用的根本區別,當然如果還不理解,沒關系,下面就要圖文并茂的徹底分析啦。

前面我們說過java中并不存在引用調用,這點是沒錯的,因為java程序設計語言確實是采用了按值調用,即call by value。也就是說方法得到的是所有參數值的一個拷貝,方法并不能修改傳遞給它的任何參數變量的內容。下面我們來看一個例子:

package com.zejian.test;
/**
 * java中的按值調用
 * @author zejian
 */
public class CallByValue {
	
	private static int x=10;
	
	public static void updateValue(int value){
		value = 3 * value;
	}
	
	public static void main(String[] args) {
		System.out.println("調用前x的值:"+x);
		updateValue(x);
		System.out.println("調用后x的值:"+x);
	}

運行程序,結果如下:

調用前x的值:10
調用后x的值:10

 可以看到x的值并沒有變化,接下來我們一起來看一下具體的執行過程:

java中類型傳遞與引用傳遞的區別是什么

分析:

1)value被初始化為x值的一個拷貝(也就是10)

2)value被乘以3后等于30,但注意此時x的值仍為10!

3)這個方法結束后,參數變量value不再使用,被回收。

結論:當傳遞方法參數類型為基本數據類型(數字以及布爾值)時,一個方法是不可能修改一個基本數據類型的參數。

當然java中除了基本數據類型還有引用數據類型,也就是對象引用,那么對于這種數據類型又是怎么樣的情況呢?我們還是一樣先來看一個例子:

聲明一個User對象類型:

執行類如下:

package com.zejian.test;
public class User {
	private String name;
	private int age;
	public User(String name, int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

執行類如下:

package com.zejian.test;
/**
 * java中的按值調用
 * @author zejian
 */
public class CallByValue {
	private static User user=null;
	public static void updateUser(User student){
		student.setName("Lishen");
		student.setAge(18);
	}
	
	
	public static void main(String[] args) {
		user = new User("zhangsan",26);
		System.out.println("調用前user的值:"+user.toString());
		updateUser(user);
		System.out.println("調用后user的值:"+user.toString());
	}

運行結果如下:

調用前user的值:User [name=zhangsan, age=26]
調用后user的值:User [name=Lishen, age=18]

很顯然,User的值被改變了,也就是說方法參數類型如果是引用類型的話,引用類型對應的值將會被修改,下面我們來分析一下這個過程:

java中類型傳遞與引用傳遞的區別是什么

過程分析:

1)student變量被初始化為user值的拷貝,這里是一個對象的引用。

2)調用student變量的set方法作用在這個引用對象上,user和student同時引用的User對象內部值被修改。

3)方法結束后,student變量不再使用,被釋放,而user還是沒有變,依然指向User對象。

結論:當傳遞方法參數類型為引用數據類型時,一個方法將修改一個引用數據類型的參數所指向對象的值。

雖然到這里兩個數據類型的傳遞都分析完了,也明白的基本數據類型的傳遞和引用數據類型的傳遞區別,前者將不會修改原數據的值,而后者將會修改引用所指向對象的值。可通過上面的實例我們可能就會覺得java同時擁有按值調用和按引用調用啊,可惜的是這樣的理解是有誤導性的,雖然上面引用傳遞表面上體現了按引用調用現象,但是java中確實只有按值調用而沒有按引用調用。到這里估計不少人都蒙逼了,下面我們通過一個反例來說明(回憶一下開頭我們所說明的按值調用與按引用調用的根本區別)。

package com.zejian.test;
/**
 * java中的按值調用
 * @author zejian
 */
public class CallByValue {
	private static User user=null;
	private static User stu=null;
	
	/**
	 * 交換兩個對象
	 * @param x
	 * @param y
	 */
	public static void swap(User x,User y){
		User temp =x;
		x=y;
		y=temp;
	}
	
	
	public static void main(String[] args) {
		user = new User("user",26);
		stu = new User("stu",18);
		System.out.println("調用前user的值:"+user.toString());
		System.out.println("調用前stu的值:"+stu.toString());
		swap(user,stu);
		System.out.println("調用后user的值:"+user.toString());
		System.out.println("調用后stu的值:"+stu.toString());
	}
}

我們通過一個swap函數來交換兩個變量user和stu的值,在前面我們說過,如果是按引用調用那么一個方法可以修改傳遞引用所對應的變量值,也就是說如果java是按引用調用的話,那么swap方法將能夠實現數據的交換,而實際運行結果是:

調用前user的值:User [name=user, age=26]
調用前stu的值:  User [name=stu, age=18]
調用后user的值:User [name=user, age=26]
調用后stu的值:  User [name=stu, age=18]

我們發現user和stu的值并沒有發生變化,也就是方法并沒有改變存儲在變量user和stu中的對象引用。swap方法的參數x和y被初始化為兩個對象引用的拷貝,這個方法交換的是這兩個拷貝的值而已,最終,所做的事都是白費力氣罷了。在方法結束后x,y將被丟棄,而原來的變量user和stu仍然引用這個方法調用之前所引用的對象。

java中類型傳遞與引用傳遞的區別是什么

這個過程也充分說明了java程序設計語言對對象采用的不是引用調用,實際上是對象引用進行的是值傳遞,當然在這里我們可以簡單理解為這就是按值調用和引用調用的區別,而且必須明白即使java函數在傳遞引用數據類型時,也只是拷貝了引用的值罷了,之所以能修改引用數據是因為它們同時指向了一個對象,但這仍然是按值調用而不是引用調用。

總結:

一個方法不能修改一個基本數據類型的參數(數值型和布爾型)。

一個方法可以修改一個引用所指向的對象狀態,但這仍然是按值調用而非引用調用。

以上就是java中類型傳遞與引用傳遞的區別是什么,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐亭县| 商洛市| 五河县| 汾西县| 岳西县| 虹口区| 礼泉县| 内江市| 调兵山市| 宿迁市| 玉屏| 江安县| 涿鹿县| 子长县| 和龙市| 灵寿县| 松江区| 田阳县| 乌恰县| 本溪市| 潢川县| 平南县| 宁强县| 阜新| 皮山县| 微博| 丰原市| 广平县| 甘谷县| 自贡市| 江北区| 淮阳县| 赣榆县| 静海县| 龙川县| 南昌市| 呼图壁县| 固原市| 炎陵县| 江源县| 伊宁县|