1. 程式人生 > >final & finally & finalize()

final & finally & finalize()

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
沒怎麼看明白 以後來補上