欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Java編程中final,finalize,finally的區(qū)別

 更新時(shí)間:2015年11月12日 15:41:48   作者:注子  
這篇文章主要介紹了詳解Java編程中final,finalize,finally的區(qū)別,這個(gè)在Java面試題中簡直是太常見了...需要的朋友可以參考下

final:
final可以讓你控制你的成員、方法或者是一個(gè)類是否可被覆寫或繼承等功能,這些特點(diǎn)使final在Java中擁有了一個(gè)不可或缺的地位,也是學(xué)習(xí)Java時(shí)必須要知道和掌握的關(guān)鍵字之一。
final成員
當(dāng)你在類中定義變量時(shí),在其前面加上final關(guān)鍵字,那便是說,這個(gè)變量一旦被初始化便不可改變,這里不可改變的意思對基本類型來說是其值不可變,而對于對象變量來說其引用不可再變。其初始化可以在兩個(gè)地方,一是其定義處,二是在構(gòu)造函數(shù)中,兩者只能選其一。
下面程序很簡單的演示了final的常規(guī)用法:

public class Test{
 final int t = 1; // 在定義時(shí)給值
 // 或者(兩者只能選其一)
 final int t;
 public Test(){
  t = 3; // 構(gòu)造時(shí)給值
}
}

還有一種用法是定義方法中的參數(shù)為final,對于基本類型的變量,這樣做并沒有什么實(shí)際意義,因?yàn)榛绢愋偷淖兞吭谡{(diào)用方法時(shí)是傳值的,也就是說你可以在方法中更改這個(gè)參數(shù)變量而不會(huì)影響到調(diào)用語句,然而對于對象變量,卻顯得很實(shí)用,因?yàn)閷ο笞兞吭趥鬟f時(shí)是傳遞其引用,這樣你在方法中對對象變量的修改也會(huì)影響到調(diào)用語句中的對象變量,當(dāng)你在方法中不需要改變作為參數(shù)的對象變量時(shí),明確使用final進(jìn)行聲明,會(huì)防止你無意的修改而影響到調(diào)用方法。
另外方法中的內(nèi)部類在用到方法中的參變量時(shí),此參變也必須聲明為final才可使用,如下代碼所示:

public class Test{
 void print(final String str){
  class InnerTest{
   InnerTest (){
    System.out.println(str);
   }
  }
  InnerTest it=new InnerTest ();
 }
 public static void main(String[] args){
  Test test=new Test();
  test.print("Hello word!!!");
 }
}

final方法
將方法聲明為final那有兩個(gè)原因,第一就是說明你已經(jīng)知道這個(gè)方法提供的功能已經(jīng)滿足你要求,不需要進(jìn)行擴(kuò)展,并且也不允許任何從此類繼承的類來覆寫這個(gè)方法,但是繼承仍然可以繼承這個(gè)方法,也就是說可以直接使用。第二就是允許編譯器將所有對此方法的調(diào)用轉(zhuǎn)化為inline(行內(nèi))調(diào)用的機(jī)制,它會(huì)使你在調(diào)用final方法時(shí),直接將方法主體插入到調(diào)用處,而不是進(jìn)行例行的方法調(diào)用,例如保存斷點(diǎn),壓棧等,這樣可能會(huì)使你的程序效率有所提高,然而當(dāng)你的方法主體非常龐大時(shí),或你在多處調(diào)用此方法,那么你的調(diào)用主體代碼便會(huì)迅速膨脹,可能反而會(huì)影響效率,所以你要慎用final進(jìn)行方法定義。
final類
當(dāng)你將final用于類身上時(shí),你就需要仔細(xì)考慮,因?yàn)橐粋€(gè)final類是無法被任何人繼承的,那也就意味著此類在一個(gè)繼承樹中是一個(gè)葉子類,并且此類的設(shè)計(jì)已被認(rèn)為很完美而不需要進(jìn)行修改或擴(kuò)展。對于final類中的成員,你可以定義其為final,也可以不是final。而對于方法,由于所屬類為final的關(guān)系,自然也就成了final型的。你也可以明確的給final類中的方法加上一個(gè)final,但這顯然沒有意義。

finally:
finally 關(guān)鍵字是對 Java 異常處理模型的最佳補(bǔ)充。 finally 結(jié)構(gòu)使代碼總會(huì)執(zhí)行,而不管有無異常發(fā)生。使用 finally 可以維護(hù)對象的內(nèi)部狀態(tài),并可以清理非內(nèi)存資源。如果沒有 finally,您的代碼就會(huì)很費(fèi)解。例如,下面的代碼說明,在不使用 finally 的情況下您如何編寫代碼來釋放非內(nèi)存資源:

public void writeFile(String filePath, String fileName, String args)
   throws IOException

 {

  FileWriter fw = new FileWriter(filePath + fileName);
  try {

   fw.write(args);
  } catch (IOException e) {
   //1
   fw.close();
   throw e;
  }
//2
  fw.close();
 }

這段代碼創(chuàng)建了一個(gè)FileWriter object,并調(diào)用 write 方法。在退出該方法之前,您必須關(guān)閉FileWriter object,以避免資源漏洞。為了完成這一任務(wù),我們在 //2 處調(diào)用 close,它是該方法的最后一條語句。但是,如果 try 塊中發(fā)生一個(gè)異常會(huì)怎么樣呢?在這種情況下,//2 處的 close 調(diào)用永遠(yuǎn)不會(huì)發(fā)生。因此,您必須捕獲這個(gè)異常,并在重新發(fā)出這個(gè)異常之前在 //1 處插入對 close 的另一個(gè)調(diào)用。這樣就可以確保在退出該方法之前關(guān)閉FileWriter object。這樣編寫代碼既麻煩又易于出錯(cuò),但在沒有 finally 的情況下這是必不可少的。有了 finally,前面的代碼就可以重寫為以下的形式:

public void writeFile(String filePath, String fileName, String args)
   throws IOException

 {

  FileWriter fw = new FileWriter(filePath + fileName);
  try {

   fw.write(args);
  } catch (IOException e) {
   throw e;
  } finally {

   fw.close();
  }
 }

finally 塊確保 close 方法總被執(zhí)行,而不管 try 塊內(nèi)是否發(fā)出異常。因此,可以確保在退出該方法之前總會(huì)調(diào)用 close 方法。這樣您就可以確信FileWriter object被關(guān)閉并且您沒有泄漏資源。

finalize:

  根據(jù)Java語言規(guī)范,JVM保證調(diào)用finalize函數(shù)之前,這個(gè)對象是不可達(dá)的,但是JVM不保證這個(gè)函數(shù)一定會(huì)被調(diào)用。另外,規(guī)范還保證finalize函數(shù)最多運(yùn)行一次。

  通常,finalize用于一些不容易控制、并且非常重要資源的釋放,例如一些I/O的操作,數(shù)據(jù)的連接。這些資源的釋放對整個(gè)應(yīng)用程序是非常關(guān)鍵的。在這種情況下,程序員應(yīng)該以通過程序本身管理(包括釋放)這些資源為主,以finalize函數(shù)釋放資源方式為輔,形成一種雙保險(xiǎn)的管理機(jī)制,而不應(yīng)該僅僅依靠finalize來釋放資源。

總結(jié)

final— 修飾符(關(guān)鍵字)如果一個(gè)類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個(gè)類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明時(shí)給定初值,而在以后的引用中只能讀取,不可修改。被聲明為final的方法也同樣只能使用,不能重載。
 
finally—再異常處理時(shí)提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個(gè)異常,那么相匹配的 catch 子句就會(huì)執(zhí)行,然后控制就會(huì)進(jìn)入 finally 塊(如果有的話)。 

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


 

相關(guān)文章

最新評論