Android源碼中final關(guān)鍵字的用法及final,finally,finalize的區(qū)別
hi 大家好,今日,天氣劇變,非常冷,不想出門,于是給大家寫了篇文章,關(guān)于android final關(guān)鍵字及final,finally,finalize的區(qū)別相關(guān)知識(shí),具體詳情如下所示:
先預(yù)告一下,下文中僅涉及java語(yǔ)法的討論,和Android源碼關(guān)系不大,請(qǐng)不要有閱讀壓力。
我發(fā)現(xiàn)在Android的源碼中很多地方對(duì)final關(guān)鍵字的用法很是“別出心裁”,之所以這么說(shuō)是因?yàn)槲覐臎]看過是這么使用final關(guān)鍵字的,一個(gè)典型的例子是View類中onScrollChanged方法(不妨將其成為方案一):
protected void onScrollChanged(int l, int t, int oldl, int oldt) { mBackgroundSizeChanged = true; final AttachInfo ai = mAttachInfo; if (ai != null) { ai.mViewScrollChanged = true; } }
看到了嗎?此處mAttachInfo是View類的一個(gè)成員變量,而在這個(gè)方法中Android的程序員并沒有直接操作mAttachInfo變量,而是先賦值給一個(gè)標(biāo)明為final的局部變量ai,然后再操作這個(gè)ai。
這個(gè)寫法我很是想不通,這不是多此一舉嗎?但是仔細(xì)想想又覺得沒這么簡(jiǎn)單,身經(jīng)百戰(zhàn)的Android開發(fā)小組這么寫應(yīng)該不會(huì)是空穴來(lái)風(fēng),難道這種寫法真的有其他的目的?
想了很久也猜了很久,有個(gè)念頭突然蹦了出來(lái),難道這種寫法是因?yàn)槎嗑€程編程的需要?考慮下面這種寫法(不妨將其成為方案二):
protected void onScrollChanged(int l, int t, int oldl, int oldt) { mBackgroundSizeChanged = true; if (mAttachInfo != null) { // #1 mAttachInfo.mViewScrollChanged = true; // #2 } }
在上面這種寫法中,取消了final的局部變量ai而直接操作mAttachInfo??紤]這樣一種場(chǎng)景,假設(shè)線程A執(zhí)行完#1將要執(zhí)行#2時(shí),突然有另外一個(gè)線程B在其他地方對(duì)mAttachInfo做了修改,將其指向了另外一個(gè)對(duì)象,那么線程A執(zhí)行到#2時(shí),操作的將是這個(gè)新的對(duì)象而不是原對(duì)象,而在方案一中,則可以避免這種現(xiàn)象。
Android開發(fā)的學(xué)習(xí)流程 final,finally,finalize的區(qū)別
Android的發(fā)展越來(lái)越快,Android開發(fā)人員越來(lái)越多,當(dāng)兩種情況碰撞,在諸多開發(fā)者中跟緊Android步伐脫穎而出就顯得十分必要,雖然Android開發(fā)行業(yè)薪資高,潛力大,但人往高處走,有更大的上升空間就一定要抓住機(jī)會(huì),Android開發(fā)行業(yè)其實(shí)很簡(jiǎn)單,高技能行業(yè)行業(yè)唯一重要的要求就是技能,所以學(xué)好Android開發(fā)直接關(guān)系到未來(lái)的職業(yè)發(fā)展,千鋒Android培訓(xùn)機(jī)構(gòu)作為行業(yè)最具權(quán)威的Android研發(fā)和人才培訓(xùn)中心,是教育局教育管理信息中心認(rèn)證的全國(guó)移動(dòng)互聯(lián)網(wǎng)人才實(shí)訓(xùn)基地,專業(yè)的教學(xué)和完善的系統(tǒng)培養(yǎng)了大批高技能Android開發(fā)人才,千鋒重視學(xué)員的基礎(chǔ)和后續(xù)發(fā)展,從Java開始魔鬼式高強(qiáng)度代碼訓(xùn)練,Android應(yīng)用開發(fā)和Android游戲開發(fā)讓學(xué)員擁有拿到高薪的實(shí)力,項(xiàng)目實(shí)戰(zhàn)把理論知識(shí)系統(tǒng)的與項(xiàng)目結(jié)合,增加學(xué)員的開發(fā)經(jīng)驗(yàn)。
Android初始階段的學(xué)習(xí)在Java培訓(xùn)的過程中,final,finally,finalize是有區(qū)別的:
Final:用于聲明屬性、方法和類。修飾的是基本類型,就表示這個(gè)變量被賦予的值是不可變的,即它是個(gè)常量;final修飾的方法不能被子類重寫,但不影響子類的繼承;final修飾的類不能被繼承 。
Finally:只用在try-catch-finally語(yǔ)句中,不論有異常還是沒有異常,這段語(yǔ)句最終總被執(zhí)行。
Finalize:此方法是Object類中的一個(gè)方法(所有類都有這個(gè)方法),是GC(garbage collertor)運(yùn)行機(jī)制的一部分,是在GC清理它所從屬的對(duì)象時(shí)被調(diào)用的,如果執(zhí)行它的過成中拋出了無(wú)法捕獲的異常,GC將終止對(duì)該對(duì)象的清理,并且該異常會(huì)被忽略,知道下一次GC開始清理這個(gè)對(duì)象時(shí),它的Finalize()會(huì)被再次調(diào)用,調(diào)用他們的作用只是建議GC啟動(dòng),清理無(wú)用對(duì)象釋放內(nèi)存空間,但GC的啟動(dòng)并不是一定的,這由java虛擬機(jī)來(lái)決定,知道java虛擬機(jī)停止運(yùn)行。
相關(guān)文章
Android入門之實(shí)現(xiàn)自定義Adapter
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)自定義Adapter,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Android有一定的幫助,需要的可以參考一下2022-11-11Android可篩選的彈窗控件CustomFiltControl
這篇文章主要為大家詳細(xì)介紹了Android可篩選的彈窗控件CustomFiltControl,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android利用CountDownTimer實(shí)現(xiàn)倒計(jì)時(shí)功能 Android實(shí)現(xiàn)停留5s跳轉(zhuǎn)到登錄頁(yè)面
這篇文章主要為大家詳細(xì)介紹了Android利用CountDownTimer實(shí)現(xiàn)倒計(jì)時(shí)功能,Android實(shí)現(xiàn)停留5s跳轉(zhuǎn)到登錄頁(yè)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07創(chuàng)建Android守護(hù)進(jìn)程實(shí)例(底層服務(wù))
這篇文章主要介紹了創(chuàng)建Android守護(hù)進(jìn)程實(shí)例(底層服務(wù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-03-03Android TextSwitcher實(shí)現(xiàn)文字上下翻牌效果(銅板街)
這篇文章主要介紹了Android TextSwitcher實(shí)現(xiàn)文字上下翻牌效果(銅板街),需要的朋友可以參考下2017-05-05實(shí)例分析Android中HandlerThread線程用法
本篇文章主要給大家介紹了Android HandlerThread使用介紹以及源碼解析,有需要的朋友參考學(xué)習(xí)下吧。2017-12-12詳解Android ScrollView嵌套EditText出現(xiàn)的滑動(dòng)問題
本篇文章主要介紹了詳解ScrollView嵌套EditText出現(xiàn)的滑動(dòng)問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-01-01android獲取附近藍(lán)牙設(shè)備并計(jì)算距離的實(shí)例代碼
下面小編就為大家分享一篇android獲取附近藍(lán)牙設(shè)備并計(jì)算距離的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-01-01Android自定義viewgroup快速滑動(dòng)(4)
這篇文章主要為大家詳細(xì)介紹了Android自定義viewgroup快速滑動(dòng)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12