final 和 static之間的區別和聯系


關鍵字final和關鍵字static兩者的含義並不相似,但是筆者常常使用一段時間后就會忘記它們之間的區別,因為它倆總是相伴着出現。當只出現其中一個時,就對其代表的含義不甚清晰了。故而特地將相關知識點記下,便於每次遺忘時查閱。

final

final關鍵字顧名思義代表“最后的”,意味着不能被更改。它的定義,可以概括地分為以下三點:

  1. 被final修飾的類不能被繼承;
  2. 被final修飾的方法不能被重寫;
  3. 被final修飾的變量不能被改變。注:引用類型的變量,引用不可變,但是引用所指向的內容是可變的

如果一個方法被final修飾,那么在編譯階段,JVM會為其尋求內聯,即相當於將該方法中的語句都添加到調用該方法的代碼中,去除這個方法。函數的調用是需要一定的開銷的:保護現場、建立堆棧、恢復現場等,對於一些代碼量不大,又頻繁調用的函數來說,時空的消耗都是很大的,所以內聯有助於提升Java的效率。因此如果已經確定某一個方法不會被繼承,就盡量用final來修飾。

static

static關鍵字同樣可以用於修飾類、方法和變量,但它修飾的類只能是內部類,它所修飾的方法和變量可以稱為“靜態方法”、“靜態變量”,也可以稱為“類方法”、“類變量”,后一種稱呼顯然更貼近於它的實際含義。相對於“類方法”、“類變量”的是“實例方法”、“實例變量”,也就是沒有用關鍵字static修飾的方法和變量。一個類可以有很多對象(實例),對於非靜態變量,每個對象都擁有,而靜態變量,則是所有對象共有。

  • 靜態資源是獨立於類而存在的,所有實例共享,在類初始化的時候加載;
  • 非靜態資源是在new一個新對象的時候加載,即生成實例的時候。

通過以上兩點,可以得出:
當類只進行了初始化,還未產生實例的時候,非靜態資源是未被加載出來的,因而在靜態方法中引用非靜態資源是錯誤的
當父類子類都存在靜態資源和非靜態資源的時候,new第一個子類對象時,調用資源的順序是:父類靜態資源 -> 子類靜態資源 -> 父類構造函數 -> 子類構造函數。由於靜態 資源初始化只需一次,new第二個子類對象時,調用資源的順序就是 父類構造函數 -> 子類構造函數

static final

通常static final連用來表示常量,只需要有一份,類的所有對象都共享且不可被更改。如果只用final,則每個實例都需要存儲該數據,且隨着它的使用,內存不斷地分配又釋放。如果這個常量是一個隨機生成的數據,那么每個對象創建時,它都需要隨機生成一次,那么對象和對象之間,生成的數據不等,常量成了變量。



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM