final+static
final
final關(guān)鍵字顧名思義代表“最后的”,意味著不能被更改。它的定義,可以概括地分為以下三點:
如果一個方法被final修飾,那么在編譯階段,JVM會為其尋求內(nèi)聯(lián),即相當(dāng)于將該方法中的語句都添加到調(diào)用該方法的代碼中,去除這個方法。函數(shù)的調(diào)用是需要一定的開銷的:保護(hù)現(xiàn)場、建立堆棧、恢復(fù)現(xiàn)場等,對于一些代碼量不大,又頻繁調(diào)用的函數(shù)來說,時空的消耗都是很大的,所以內(nèi)聯(lián)有助于提升Java的效率。因此如果已經(jīng)確定某一個方法不會被繼承,就盡量用final來修飾。
static
static關(guān)鍵字同樣可以用于修飾類、方法和變量,但它修飾的類只能是內(nèi)部類,它所修飾的方法和變量可以稱為“靜態(tài)方法”、“靜態(tài)變量”,也可以稱為“類方法”、“類變量”,后一種稱呼顯然更貼近于它的實際含義。相對于“類方法”、“類變量”的是“實例方法”、“實例變量”,也就是沒有用關(guān)鍵字static修飾的方法和變量。一個類可以有很多對象(實例),對于非靜態(tài)變量,每個對象都擁有,而靜態(tài)變量,則是所有對象共有。
- 靜態(tài)資源是獨立于類而存在的,所有實例共享,在類初始化的時候加載;
- 非靜態(tài)資源是在new一個新對象的時候加載,即生成實例的時候。
通過以上兩點,可以得出:
當(dāng)類只進(jìn)行了初始化,還未產(chǎn)生實例的時候,非靜態(tài)資源是未被加載出來的,因而在靜態(tài)方法中引用非靜態(tài)資源是錯誤的
當(dāng)父類子類都存在靜態(tài)資源和非靜態(tài)資源的時候,new第一個子類對象時,調(diào)用資源的順序是:父類靜態(tài)資源 -> 子類靜態(tài)資源 -> 父類構(gòu)造函數(shù) -> 子類構(gòu)造函數(shù)。由于靜態(tài) 資源初始化只需一次,new第二個子類對象時,調(diào)用資源的順序就是 父類構(gòu)造函數(shù) -> 子類構(gòu)造函數(shù)
轉(zhuǎn)載于:https://www.cnblogs.com/sy130908/p/11429521.html
總結(jié)
以上是生活随笔為你收集整理的final+static的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [POJ3040] Allowance
- 下一篇: 匿名对象+内部类