「每日一面」Java final、static 關鍵字

問:談談 Java 中 final、finally、finalize 的區別?

答:這道題其實沒有任何意義,無非就是考察開發者有沒有區分這幾個關鍵字的含義,僅僅關聯是因為長得像而已。

finally 用來在異常處理時提供塊來執行任何清除操作,如果拋出一個異常,則相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊。

finalize 是一個方法名,Java 允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作,這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的,它是在 Object 類中定義的,因此所有的類都繼承了它,子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作,finalize() 方法在垃圾收集器刪除對象之前對這個對象調用的。

問:java 中 static、final、static final 的區別是什麼?

答:final 可以修飾屬性、方法、類、局部變量(方法中的變量),修飾屬性的初始化可以在編譯期,也可以在運行期,初始化後不能被改變;修飾的屬性表明是一個常數;修飾方法表示方法不能在子類中被重寫;修飾類表示類不能被繼承。

static 可以修飾屬性、方法、代碼段、內部類(靜態內部類或嵌套內部類),修飾屬性的初始化在編譯期(類加載的時候),初始化後可以被修改值;修飾的屬性、方法、代碼段跟該類的具體對象無關,不創建對象也能調用 static 修飾的屬性、方法等;static 不可以修飾局部變量。

static final(或者 final static)是組合修飾,static 修飾的屬性強調它們只有一個,final 修飾的屬性表明是一個常數(創建後不能被修改),static final 修飾的屬性表示一旦給值就不可修改並且可以通過類名訪問,static final 也可以修飾方法,表示該方法不能重寫,可以在不 new 對象的情況下調用。

問:下面程序的有問題嗎,結果是什麼?

「每日一面」Java final、static 關鍵字

答:沒有問題,運行結果如下:

foo called.

return called.

問:下面程序的運行結果是什麼?為什麼?

「每日一面」Java final、static 關鍵字

答:運行結果如下:

true

false

因為當 final 變量是基本數據類型以及 String 類型時如果在編譯期間能知道它的確切值則編譯器會把它當做編譯期常量使用,也就是說在用到該 final 變量的地方相當於直接訪問了這個常量,不需要在運行時確定,所以上面代碼中由於變量 b 被 final 修飾從而被當做編譯器常量,故在使用到 b 的地方會直接將變量 b 替換為它的值,而對於變量 d 的訪問卻需要在運行時通過鏈接來進行。

「每日一面」Java final、static 關鍵字


分享到:


相關文章: