1. 程式人生 > >【Java】 Java 基礎 —— final, finally, finalize 的區別

【Java】 Java 基礎 —— final, finally, finalize 的區別

一、前言 這次說說final、finally、finalize這三者的區別,其實對這三者有了解的程式設計師,基本都知道,他們三個之間沒有毛線關係。就是因為名字相似,其他的什麼也沒有。

二、final

  • final可以修飾類、方法、變數。表示被修飾的類、方法、變數具有不可變的特性。
  • 1.修飾變數,表明定義後值不能被改變
  • 2.修飾方法,表明方法是最終方法,只能被呼叫,不能覆蓋,但是可以被過載
  • 3.修飾類,表明類是最終類,不能被繼承

修飾變數: 當對a賦值後,再次賦值會報錯;

    /**
     * 修飾變數
     */
    @Test
    public void test1() {
        final int a;
        int i = 1;
        int j = 2;
        a = i;
        System.out.println(a);
        a = j;
        System.out.println(a);

    }

在這裡插入圖片描述 修飾方法:方法可以被過載,不能被重寫 在這裡插入圖片描述 修飾類:類不可被繼承

在這裡插入圖片描述 三、finally finally是異常處理中的,最後執行的一些收尾的工作,回收資源,比如關閉資料庫連線,關閉io通道,關閉緩衝區等。

為了保證一定能回收try塊中開啟的物理資源,異常處理機制提供了finally塊。
不管try塊中的程式碼是否出現異常,也不管哪一個catch塊被執行,
甚至在try塊或catch塊中執行了return語句,finally塊總會被執行。

以檔案輸入流展示: 無論是否報錯,都執行finally塊。

package com.dmsd.finaltest;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * finally 異常後收尾,清除操作
 * Created by Ares on 2018/3/29.
 */
public class finallyTest {
    public void finallyTest1()  {
        FileInputStream fileInputStream =null;
        try {
             fileInputStream =new FileInputStream("cat.jpg");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

注意:通常情況下,不要在finally塊中使用return或者throw等導致方法終止語句,一旦在finally中使用了,將會導致try塊、catch塊中的return、throw語句失效。

原因:當java程式執行try塊、catch塊的時候,執行到了return或者throw丟擲錯誤,導致方法結束,但是系統執行到了這兩個語句,不會馬上結束方法,而是去尋找異常處理中,有沒有finally塊。如果沒有就執行return或者throw。如果有的話,會立即執行finally塊中的程式碼,直到finally執行完成後,才會再跳回來執行try…catch中的return或者throw;如果finally中使用了return或者throw等終止語句,finally塊已經終止了方法,系統不會跳回執行try…catch的任何程式碼了。

public static boolean test(){
    try
    {
        //因為finally塊中包含了return語句,下面的return失效
        return  true;
    }
    finally{
        return false;
    }
}

四、finalize() 方法 首先注意一下,finalize()是一個方法,這個方法位於java.lang.Object類下:

   protected void finalize() throws Throwable { }

作用是:

在垃圾收集器將物件從記憶體中清除出去之前做必要的清理工作。

注意:

  • 永遠不要主動呼叫某個物件的finalize()方法,該方法應交給垃圾回收機制呼叫

  • finalize()方法何時被呼叫,是否被呼叫具有不確定性,不要把finalize()方法當成一定會被執行的方法

  • 當JVM執行可以恢復物件的finalize()方法時,可能使用該物件或系統中其他物件重新程式設計可達狀態

  • 當JVN呼叫finalize()方法出現異常的時候,垃圾回收機制不會報告異常,程式繼續執行。

 class People{  

     final void output(String name){  
         System.out.println(name);  
    }  
 }  
 class Stu extends People{  

     final void output(String name,int id){//可以被過載  
        System.out.println(name);  
   }  
    public void finalize() throws Throwable{             
        super.finalize();    
        System.out.println("finalize method was called!");  
     }  
 }  
 public class Main {  

     public static void main(String[] args){  
     }  
}

五、小結 多總結,多使用,多體驗吧。