今天提到的點,很基礎,大概就是:在定義的成員變量上面,可能會有提示:Field can be converted to a local variable
意思就是 字段可以被轉化成一個局部變量。如下圖:
這個case,網上一堆的解釋,千篇一律,大部分只是在說如何去掉這個提示,解決方案有如下兩種:
1、@SuppressWarnings("FieldCanBeLocal")
2、把全局變量刪除,在使用的地方定義即可,不用全部都使用全局定義變量。
以上這都不是重點,也不算完,需要我們進一步考慮下,爲什麼會出這個提示,我們不按照建議修改代碼會有什麼影響,徹底弄懂這個問題,就需要去真正瞭解成員變量和局部變量的區別(往下看)👇
成員變量和局部變量的區別
(1)在類中的位置不同
成員變量:類中方法外
局部變量:方法定義中或者方法聲明上
(2)在內存中的位置不同
成員變量:在堆中(方法區中的靜態區)
局部變量:在棧中
(3)生命週期不同
成員變量:隨着對象的創建而存在,隨着對象的消失而消失
局部變量:隨着方法的調用而存在,隨着方法的調用完畢而消失
(4)初始化值不同
成員變量:成員變量如果沒有被賦初值,則會自動以類型的默認值而賦值(一種情況例外被final修飾但沒有被static修飾的成員變量必須顯示地賦值)
局部變量:沒有默認值,必須定義,賦值,然後才能使用.
成員變量和局部變量區別,看到了這裏大家也就真正明白了,爲啥會提示了,重點就是:
成員變量生命週期比局部變量生命週期長,局部變量在方法消失之後,也就從內存中消失了,釋放所佔的內存。而如果一個變量只是一個局部變量,卻定義成了成員變量,那也就相當於這個變量在內存中的存在時間變長了。
說到這裏,可能有個別同學會說:“一個變量的事,不當緊不當緊,多存在一會沒事沒事”,那我就要說了,如果抱有這麼個“無所謂”的態度,那麼我敢冒昧的斷言:在你的項目工程中 這種“局部變量被定義爲成員變量”的情況應該還有。多個這種情況的存在,也就會額外增加內存的開銷了(至於到達多少量級的內存開銷 在這裏就不討論了,不一定),反正至少是,實現同樣的業務,存在這種情況的代碼,會比不存在的在內存佔比、使用上要高。嚴重的講,積少成多,會導致性能問題。你覺得呢?
今天貼出來這個簡單的、常見的case,主要是想表達一個思想:平時寫代碼就要嚴謹、對自己高要求、不要放過任何一個不合理的細節,養成良好的編碼習慣,以紮實的語言基本功爲理論依據,來編寫高質量代碼。這麼做,慢慢的、漸漸地,你會變的越來越優秀。
以上,你認可嗎?