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