亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析java基本數(shù)據(jù)類型傳遞與引用傳遞區(qū)別

 更新時(shí)間:2019年03月11日 10:26:50   作者:Jay乀  
這篇文章主要介紹了java基本數(shù)據(jù)類型傳遞與引用傳遞區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

按值調(diào)用(call by value)

按引用調(diào)用(call by reference)

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

前面我們說過java中并不存在引用調(diào)用,這點(diǎn)是沒錯(cuò)的,因?yàn)閖ava程序設(shè)計(jì)語(yǔ)言確實(shí)是采用了按值調(diào)用,即call by value。也就是說方法得到的是所有參數(shù)值的一個(gè)拷貝,方法并不能修改傳遞給它的任何參數(shù)變量的內(nèi)容。下面我們來看一個(gè)例子:

package com.zejian.test;
/**
 * java中的按值調(diào)用
 * @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("調(diào)用前x的值:"+x);
		updateValue(x);
		System.out.println("調(diào)用后x的值:"+x);
	}

運(yùn)行程序,結(jié)果如下:

調(diào)用前x的值:10
調(diào)用后x的值:10

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

分析:

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

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

3)這個(gè)方法結(jié)束后,參數(shù)變量value不再使用,被回收。

結(jié)論:當(dāng)傳遞方法參數(shù)類型為基本數(shù)據(jù)類型(數(shù)字以及布爾值)時(shí),一個(gè)方法是不可能修改一個(gè)基本數(shù)據(jù)類型的參數(shù)。

當(dāng)然java中除了基本數(shù)據(jù)類型還有引用數(shù)據(jù)類型,也就是對(duì)象引用,那么對(duì)于這種數(shù)據(jù)類型又是怎么樣的情況呢?我們還是一樣先來看一個(gè)例子:

聲明一個(gè)User對(duì)象類型:

執(zhí)行類如下:

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;
	}

執(zhí)行類如下:

package com.zejian.test;
/**
 * java中的按值調(diào)用
 * @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("調(diào)用前user的值:"+user.toString());
		updateUser(user);
		System.out.println("調(diào)用后user的值:"+user.toString());
	}

運(yùn)行結(jié)果如下:

調(diào)用前user的值:User [name=zhangsan, age=26]
調(diào)用后user的值:User [name=Lishen, age=18]

很顯然,User的值被改變了,也就是說方法參數(shù)類型如果是引用類型的話,引用類型對(duì)應(yīng)的值將會(huì)被修改,下面我們來分析一下這個(gè)過程:

過程分析:

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

2)調(diào)用student變量的set方法作用在這個(gè)引用對(duì)象上,user和student同時(shí)引用的User對(duì)象內(nèi)部值被修改。

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

結(jié)論:當(dāng)傳遞方法參數(shù)類型為引用數(shù)據(jù)類型時(shí),一個(gè)方法將修改一個(gè)引用數(shù)據(jù)類型的參數(shù)所指向?qū)ο蟮闹怠?/p>

雖然到這里兩個(gè)數(shù)據(jù)類型的傳遞都分析完了,也明白的基本數(shù)據(jù)類型的傳遞和引用數(shù)據(jù)類型的傳遞區(qū)別,前者將不會(huì)修改原數(shù)據(jù)的值,而后者將會(huì)修改引用所指向?qū)ο蟮闹怠?赏ㄟ^上面的實(shí)例我們可能就會(huì)覺得java同時(shí)擁有按值調(diào)用和按引用調(diào)用啊,可惜的是這樣的理解是有誤導(dǎo)性的,雖然上面引用傳遞表面上體現(xiàn)了按引用調(diào)用現(xiàn)象,但是java中確實(shí)只有按值調(diào)用而沒有按引用調(diào)用。到這里估計(jì)不少人都蒙逼了,下面我們通過一個(gè)反例來說明(回憶一下開頭我們所說明的按值調(diào)用與按引用調(diào)用的根本區(qū)別)。

package com.zejian.test;
/**
 * java中的按值調(diào)用
 * @author zejian
 */
public class CallByValue {
	private static User user=null;
	private static User stu=null;
	
	/**
	 * 交換兩個(gè)對(duì)象
	 * @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("調(diào)用前user的值:"+user.toString());
		System.out.println("調(diào)用前stu的值:"+stu.toString());
		swap(user,stu);
		System.out.println("調(diào)用后user的值:"+user.toString());
		System.out.println("調(diào)用后stu的值:"+stu.toString());
	}
}

我們通過一個(gè)swap函數(shù)來交換兩個(gè)變量user和stu的值,在前面我們說過,如果是按引用調(diào)用那么一個(gè)方法可以修改傳遞引用所對(duì)應(yīng)的變量值,也就是說如果java是按引用調(diào)用的話,那么swap方法將能夠?qū)崿F(xiàn)數(shù)據(jù)的交換,而實(shí)際運(yùn)行結(jié)果是:

調(diào)用前user的值:User [name=user, age=26]
調(diào)用前stu的值:  User [name=stu, age=18]
調(diào)用后user的值:User [name=user, age=26]
調(diào)用后stu的值:  User [name=stu, age=18]

我們發(fā)現(xiàn)user和stu的值并沒有發(fā)生變化,也就是方法并沒有改變存儲(chǔ)在變量user和stu中的對(duì)象引用。swap方法的參數(shù)x和y被初始化為兩個(gè)對(duì)象引用的拷貝,這個(gè)方法交換的是這兩個(gè)拷貝的值而已,最終,所做的事都是白費(fèi)力氣罷了。在方法結(jié)束后x,y將被丟棄,而原來的變量user和stu仍然引用這個(gè)方法調(diào)用之前所引用的對(duì)象。

這個(gè)過程也充分說明了java程序設(shè)計(jì)語(yǔ)言對(duì)對(duì)象采用的不是引用調(diào)用,實(shí)際上是對(duì)象引用進(jìn)行的是值傳遞,當(dāng)然在這里我們可以簡(jiǎn)單理解為這就是按值調(diào)用和引用調(diào)用的區(qū)別,而且必須明白即使java函數(shù)在傳遞引用數(shù)據(jù)類型時(shí),也只是拷貝了引用的值罷了,之所以能修改引用數(shù)據(jù)是因?yàn)樗鼈兺瑫r(shí)指向了一個(gè)對(duì)象,但這仍然是按值調(diào)用而不是引用調(diào)用。

總結(jié):

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

一個(gè)方法可以修改一個(gè)引用所指向的對(duì)象狀態(tài),但這仍然是按值調(diào)用而非引用調(diào)用。

上面兩種傳遞都進(jìn)行了值拷貝的過程。

以上所述是小編給大家介紹的java基本數(shù)據(jù)類型傳遞與引用傳遞區(qū)別詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法

    在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法

    這篇文章主要介紹了在CentOS系統(tǒng)中檢測(cè)Java安裝及運(yùn)行jar應(yīng)用的方法,同樣適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下
    2015-06-06
  • 詳解MyBatis Plus中分頁(yè)插件的使用

    詳解MyBatis Plus中分頁(yè)插件的使用

    這篇文章主要為大家詳細(xì)介紹了MyBatis Plus中分頁(yè)插件使用的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-02-02
  • Java的MyBatis框架中關(guān)鍵的XML字段映射的配置參數(shù)詳解

    Java的MyBatis框架中關(guān)鍵的XML字段映射的配置參數(shù)詳解

    將XML文件的schema字段映射到數(shù)據(jù)庫(kù)的schema是我們操作數(shù)據(jù)庫(kù)的常用手段,這里我們就來整理一些Java的MyBatis框架中關(guān)鍵的XML字段映射的配置參數(shù)詳解,需要的朋友可以參考下
    2016-06-06
  • 詳解JAVA設(shè)計(jì)模式之代理模式

    詳解JAVA設(shè)計(jì)模式之代理模式

    這篇文章主要介紹了JAVA設(shè)計(jì)模式之代理模式的的相關(guān)資料,文中代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Java數(shù)組隊(duì)列概念與用法實(shí)例分析

    Java數(shù)組隊(duì)列概念與用法實(shí)例分析

    這篇文章主要介紹了Java數(shù)組隊(duì)列概念與用法,結(jié)合實(shí)例形式分析了Java數(shù)組隊(duì)列相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • java實(shí)現(xiàn)解析Cron時(shí)間表達(dá)式為中文描述

    java實(shí)現(xiàn)解析Cron時(shí)間表達(dá)式為中文描述

    這篇文章主要為大家詳細(xì)介紹了java如何實(shí)現(xiàn)解析Cron時(shí)間表達(dá)式為中文描述,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-11-11
  • Java中CyclicBarrier的理解與應(yīng)用詳解

    Java中CyclicBarrier的理解與應(yīng)用詳解

    這篇文章主要介紹了Java中CyclicBarrier的理解與應(yīng)用詳解,CyclicBarrier類是JUC框架中的工具類,也是一個(gè)同步輔助裝置:允許多個(gè)線程去等待直到全部線程抵達(dá)了公共的柵欄點(diǎn),需要的朋友可以參考下
    2023-12-12
  • 詳解SpringCloud Config配置中心

    詳解SpringCloud Config配置中心

    這篇文章主要介紹了詳解SpringCloud Config配置中心,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-03-03
  • Spring Bean生命周期之Bean的注冊(cè)詳解

    Spring Bean生命周期之Bean的注冊(cè)詳解

    這篇文章主要為大家詳細(xì)介紹了Spring Bean生命周期之Bean的注冊(cè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Spring基礎(chǔ)之AOP的概念介紹

    Spring基礎(chǔ)之AOP的概念介紹

    AOP是Spring的關(guān)鍵特性之一,雖然Spring的IOC特性并不依賴于AOP,本文重點(diǎn)介紹AOP編程中的一些術(shù)語(yǔ),這些術(shù)語(yǔ)不僅僅局限于Spring,它適用于所有的AOP編程,感興趣的朋友一起看看吧
    2022-06-06

最新評(píng)論