final & finally & finalize()
阿新 • • 發佈:2018-11-23
final
- 修飾類:不嫩被繼承,不能和abstract一同修飾
- 修飾方法:不能重寫
- 修飾變數:宣告時需賦初值
finally
執行try-catch 語句就一定會執行fianlly語句
finally 語句不一定會執行:
- 如果try-catch 語句裡面有System.ext(0) -->停止虛擬機器(0表示正常退出) ,整個程式都結束了
怎麼執行finally語句呢 - 一個執行緒正在執行try-catch語句的時候 被打斷or終止…
這篇文章講的簡直不要太詳細 有點兒長 耐心點兒
總結一下:
- finally語句是在try-catch語句的控制轉移語句(return throw break continue)之前執行的
- 如果try-catch裡面有return語句, “Java 虛擬機器會把 finally 語句塊作為subroutine直接插入到 try 語句塊或者 catch 語句塊的控制轉移語句之前。但是,還有另外一個不可忽視的因素,那就是在執行 subroutine之前,try 或者 catch 語句塊會保留其返回值到本地變量表中。待 subroutine 執行完畢之後,再恢復保留的返回值到運算元棧中,然後通過 return 或者 throw 語句將其返回給該方法的呼叫者。 ” (如果return是一個表示式或是函式 會執行這個表示式 or 函式 然後再將其值存放在本地變量表中)
- 如果返回值型別是基本資料型別之一,那麼finally裡面的語句不會對這個值有什麼改變 ;如果返回值是物件型別,那麼finally裡面的語句會對返回值產生影響。
下面的這個例子裡面的 map = null 的情況沒有弄明白 如果能告訴我原因 感激不盡!
import java.util.*; public class TestFinally { public static Map fun(){ Map<String, String> map = new HashMap<String, String>(); try{ map.put("key", "try"); return map; } catch(Exception e){ e.printStackTrace(); } finally{ map.put("key", "finally"); // finally //map = null; // try 對於這個返回值 很 疑惑 } return null; } public static void main(String[] args){ Map<String, String> map = fun(); System.out.println(map.get("key")); } }
finalize
emmm是一個方法 GC
沒怎麼看明白 以後來補上