最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java?引用傳遞的三種類型小結(jié)

 更新時(shí)間:2022年02月15日 14:32:12   作者:源君  
這篇文章主要介紹了java?引用傳遞的三種類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

java引用傳遞的三種類型

我這里使用了mldn視頻里的例子,只用于學(xué)習(xí)交流。

第一種

結(jié)果:調(diào)用前:50

調(diào)用后:1000

分析:

理解:好理解

第二種傳遞方式

先看例子

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

分析圖片:

第三種傳遞方式

結(jié)果:

分析:

對(duì)于三種引用傳遞的理解

第一種和第三種都好理解:

其實(shí)就是c語(yǔ)言那樣傳遞的是地址,當(dāng)然能夠修改屬性值,對(duì)于第二種其實(shí)就是因?yàn)镾tring類比較特殊,在第二個(gè)例子中fun()函數(shù)str2="mldn"其實(shí)mldn是個(gè)匿名對(duì)象?。?!這個(gè)等式其實(shí)就是將str2的引用的地址值改變了,也即使str1的引用地址指向了mldn這個(gè)在堆內(nèi)存的這個(gè)對(duì)象。

java引用傳值問(wèn)題

一圖勝萬(wàn)言(配上一張啟艦大神的圖,一個(gè)自定義控件寫(xiě)的很吊的大神):

這幾天一直在寫(xiě)一個(gè)項(xiàng)目,果然只搞理論是不行的,距離上一次寫(xiě)項(xiàng)目已經(jīng)快有半年了,今天無(wú)論是效率還是熟練度都大不如前

好了言歸正傳,今天要說(shuō)的這個(gè)問(wèn)題其實(shí)很簡(jiǎn)單——在java中的參數(shù)傳遞問(wèn)題。(其實(shí)我承認(rèn),這個(gè)地方我只是知道對(duì)象傳引用、普通類型傳值,典型的理論派-。+),但是這個(gè)問(wèn)題可大可小,我覺(jué)得還是要把這些縷得清清楚楚才好。

問(wèn)題起源,一個(gè)蠢到家的是失敗案例

其實(shí)今天寫(xiě)這篇文章完全是咋呼-。+,恰好是因?yàn)樽约涸谧鯮ecyclerView的萬(wàn)能適配器的時(shí)候出現(xiàn)的問(wèn)題,先給大家引入一下當(dāng)時(shí)的場(chǎng)景:

    @Override
    public void resultCallbackFromFragment(List<Contact> list) {
        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();
        ......
        contactList = list;
        adapter.notifyDataSetChanged();
        ......
    }

只留下了我們?cè)O(shè)計(jì)的代碼,其他部分的代碼全部打……了。接下來(lái)我用極其簡(jiǎn)單的組織語(yǔ)言介紹一下場(chǎng)景:

打開(kāi)一個(gè)具有復(fù)選框的界面,退出時(shí)返回選中的數(shù)據(jù),方法為一個(gè)回調(diào)方法,方法的效果是更新列表數(shù)據(jù)(contactList為我們傳入RecyclerView的源數(shù)據(jù))。

理論上說(shuō)先給contactList更新為獲取到的最新的值,然后調(diào)用notifyDataSetChanged方法,列表就刷新了,看上去一切都是那么的圓滿。然后我們看一下效果:

不要吐槽這個(gè)App背景,因?yàn)槭墙o我的小仙女做的-。+!

在上面的效果中,我們看到,在選中了兩個(gè)聯(lián)系人,點(diǎn)擊確定之后,按道理說(shuō)應(yīng)該是顯示成兩個(gè)人,怎么還是剛才的數(shù)據(jù)呢?

當(dāng)時(shí)也是知道引用類型的傳遞傳遞的是引用,回憶了一下自己當(dāng)時(shí)的思路:引用傳遞給了另一個(gè)引用,這一個(gè)引用的內(nèi)容改變了,所有的都改變了。。。。 (可能有的朋友看到我這句話覺(jué)得很好笑:哇博主你好菜啊,這么基礎(chǔ)的問(wèn)題都被繞住了,好吧我得承認(rèn)java基礎(chǔ)是有些差。。)

就是這么簡(jiǎn)單的一句話讓我饒了好幾個(gè)大彎,當(dāng)時(shí)自己已經(jīng)被繞進(jìn)去了,覺(jué)得這個(gè)數(shù)據(jù)就是被改變了啊,然后就開(kāi)始從其他地方找錯(cuò)誤,過(guò)了好久才開(kāi)始反思:是不是數(shù)據(jù)傳遞的過(guò)程出現(xiàn)了點(diǎn)問(wèn)題-。+

然后自己就開(kāi)始查找參數(shù)傳遞相關(guān)問(wèn)題,好了,現(xiàn)在開(kāi)始,我們先跳出上面這個(gè)案例中,我不希望大家被上面花里胡哨的東西影響,因?yàn)槲覀兘裉熘v的問(wèn)題只有一個(gè):java的引用傳值。

兩類參數(shù)傳遞

參數(shù)傳遞主要分為兩種:一種是參數(shù)是基本類型,一種是參數(shù)為引用類型。

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

這個(gè)相信大家都沒(méi)什么問(wèn)題,基本類型作為參數(shù)傳遞的時(shí)候是在一個(gè)方法棧中開(kāi)辟了一塊新內(nèi)存,拷貝了原來(lái)的數(shù)據(jù)值,所以無(wú)論我們?nèi)绾涡薷?,原?lái)的數(shù)據(jù)值不會(huì)受到任何影響。

舉個(gè)簡(jiǎn)單的栗子:

public class Practice2 { 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int a = 5;
		System.out.println(a);
		change(a);
		System.out.println(a);
	} 
	public static void change(int b) {
		b = 500;
	}
}

結(jié)果如下:

5
5

沒(méi)有任何變化,對(duì)吧。

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

首先我們要知道引用的數(shù)據(jù)存儲(chǔ)在棧內(nèi)存中,而引用指向的對(duì)象存儲(chǔ)在堆內(nèi)存中。

當(dāng)引用作為方法參數(shù)傳遞給方法的時(shí)候,是將引用的值拷貝一份給另一個(gè)引用,但引用指向的都是同一個(gè)堆內(nèi)存,所以進(jìn)行的修改操作同樣有效。

實(shí)例代碼:

public class Practice { 
	static A a = new A(10);
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Practice practice = new Practice();
		System.out.println(practice.a.intData);
		change(practice.a);
		System.out.println(practice.a.intData);
	} 
	public static void change(A aa) {
		aa.intData = 500;
		System.out.println(aa.intData);
	}
} 
class A{
	int intData; 
	public A(int intData) {
		this.intData = intData;
	}	
}

10
500

這么說(shuō)起來(lái)沒(méi)什么難度,對(duì)吧。

引用傳遞

其實(shí)上面所說(shuō)的引用形參傳遞,本質(zhì)上就是引用的傳遞,我們將引用傳遞給了另一個(gè)引用,那么這兩個(gè)引用都有了相同的值——既指向了相同的對(duì)象。

A a1 = new A(10);
A a2 = a1;
System.out.println("a1的intData: " + a1.intData + "   a2的intData:  " + a2.intData );
a2.intData = 500;
System.out.println("a1的intData: " + a1.intData + "   a2的intData:  " + a2.intData );

結(jié)果如下:

a1的intData: 10   a2的intData:  10
a1的intData: 500   a2的intData:  500

注意):引用類型中,形參能夠改變實(shí)參的值,或者一個(gè)引用能夠改變另一個(gè)引用的值,僅僅是因?yàn)樗麄儣?nèi)存中存儲(chǔ)的值相同,但這個(gè)值是隨時(shí)可以修改的。

這個(gè)也就是本人之前一直被困住的地方,其實(shí)只要引用存儲(chǔ)的值改變了,這兩個(gè)引用就毫無(wú)關(guān)系了。請(qǐng)見(jiàn)下面的例子:

A a1 = new A();
A a2 = a1;
System.out.println(a1);
System.out.println(a2);
a2 = new A();
System.out.println(a1);
System.out.println(a2);

結(jié)果如下:

A@33909752
A@33909752
A@33909752
A@55f96302

在a2指向新的對(duì)象后,a1和a2就已經(jīng)沒(méi)有任何關(guān)系了,因?yàn)樗麄儍蓚€(gè)引用存儲(chǔ)的值已經(jīng)完全不一樣了。

相信這張圖已經(jīng)說(shuō)的很明白了吧。

反過(guò)來(lái)再解決這個(gè)案例

現(xiàn)在有了上面的理論知識(shí),我們?cè)诜催^(guò)頭來(lái)看一開(kāi)始的這個(gè)問(wèn)題。

    @Override
    public void resultCallbackFromFragment(List<Contact> list) {
        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();
        ......
        contactList = list;
        adapter.notifyDataSetChanged();
        ......
    }

在我們獲取到了新的list之后,是給contactList賦值了一個(gè)新的引用,此時(shí)他指向的為一個(gè)新的堆內(nèi)存空間。但是適配器中的list還是指向之前的引用,因?yàn)槲覀冎皇歉淖兞薱ontactList引用的值,然后執(zhí)行notifyDataSetChanged方法,可是適配器中l(wèi)ist數(shù)據(jù)還是原來(lái)contactList指向的數(shù)據(jù)。

因此解決的辦法是:直接改變適配器中的list引用,然后調(diào)用notifyDataSetChanged方法:

    public void notifyData(List<T> mList){
        this.mList = mList;
        notifyDataSetChanged();
    }

直接在適配器中寫(xiě)一個(gè)修改數(shù)據(jù)的方法,然后在外面調(diào)用就好啦:

    @Override
    public void resultCallbackFromFragment(List<Contact> list) {
        Toast.makeText(this, "修改成功!", Toast.LENGTH_SHORT).show();
        ......
        contactList = list;
        adapter.notifyData(contactList);
        ......
    }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring事務(wù)原理解析

    Spring事務(wù)原理解析

    Spring事務(wù)有可能會(huì)提交,回滾、掛起、恢復(fù),所以Spring事務(wù)提供了一種機(jī)制,可以讓程序員來(lái)監(jiān)聽(tīng)當(dāng)前Spring事務(wù)所處于的狀態(tài),這篇文章主要介紹了Spring底層事務(wù)原理,需要的朋友可以參考下
    2022-12-12
  • 又一波Java專業(yè)人士必備書(shū)籍來(lái)襲

    又一波Java專業(yè)人士必備書(shū)籍來(lái)襲

    又一波Java專業(yè)人士必備書(shū)籍來(lái)襲,這篇文章主要向大家推薦了Java專業(yè)人士必讀的書(shū),感興趣的小伙伴們不要錯(cuò)過(guò)
    2016-09-09
  • Spring中@Transactional注解的使用詳解

    Spring中@Transactional注解的使用詳解

    @Transactional注解是Spring提供的一種聲明式事務(wù)管理方式,這篇文章主要為大家詳細(xì)介紹了@Transactional注解的原理分析及使用,需要的可以參考一下
    2023-05-05
  • Java 泛型詳解與范例

    Java 泛型詳解與范例

    hello !大家好!今天的主題就是:泛型。在使用集合類時(shí),大家就已經(jīng)接觸到泛型了,那就是每個(gè)集合類后面的尖括號(hào)<>,這樣一對(duì)尖括號(hào),在java中就稱為泛型。那么泛型這一個(gè)點(diǎn),我們又該知道多少呢?我們往下看
    2021-11-11
  • dubbo服務(wù)注冊(cè)到nacos的過(guò)程剖析

    dubbo服務(wù)注冊(cè)到nacos的過(guò)程剖析

    這篇文章主要為大家介紹了dubbo服務(wù)注冊(cè)到nacos的過(guò)程剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職極限
    2022-02-02
  • Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)分表

    Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)分表

    當(dāng)數(shù)據(jù)量比較多時(shí),放在一個(gè)表中的時(shí)候會(huì)影響查詢效率,本文主要介紹了Mybatis攔截器實(shí)現(xiàn)數(shù)據(jù)分表,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • 詳解Spring Boot最核心的27個(gè)注解,你了解多少?

    詳解Spring Boot最核心的27個(gè)注解,你了解多少?

    這篇文章主要介紹了詳解Spring Boot最核心的27個(gè)注解,你了解多少?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • java中Unsafe的使用講解

    java中Unsafe的使用講解

    這篇文章主要介紹了java中Unsafe的使用講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java使用dom4j解析xml配置文件實(shí)現(xiàn)抽象工廠反射示例

    java使用dom4j解析xml配置文件實(shí)現(xiàn)抽象工廠反射示例

    本文主要介紹了java使用dom4j讀取配置文件實(shí)現(xiàn)抽象工廠和反射的示例,在Java中也可以同Donet一樣,將差異配置在配置文件里面。另外,我們采用下面的方式實(shí)現(xiàn),將會(huì)更加便捷
    2014-01-01
  • spring redis 如何實(shí)現(xiàn)模糊查找key

    spring redis 如何實(shí)現(xiàn)模糊查找key

    這篇文章主要介紹了spring redis 如何實(shí)現(xiàn)模糊查找key的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

剑阁县| 遂昌县| 当阳市| 屯门区| 肃北| 长武县| 临清市| 华阴市| 东明县| 门头沟区| 琼中| 宜宾县| 博野县| 池州市| 江川县| 莎车县| 通化市| 南漳县| 白山市| 禹城市| 湖南省| 图片| 长顺县| 鄄城县| 武宣县| 剑川县| 彭山县| 汶上县| 韩城市| 娄烦县| 德州市| 武宣县| 勐海县| 丰县| 汝南县| 丹江口市| 永春县| 罗江县| 永德县| 敦煌市| 鸡东县|