天天看點

Java中final、finally和finalize三者的用法及差別

final的用法

final意為最終的、不可更改的。final是定義Java中類、方法以及變量修飾符的關鍵字,它有以下使用場景。

  1. 修飾變量

    由于final的不可變特性,是以當final定義變量時,需要賦予初始值,定義完成後這個變量就相當于常量,是以開發時我們一般用它來定義常量,比如π。

  2. 修飾屬性
  • 屬性是全局變量,存儲在堆記憶體中對象空間内的一個小空間裡,雖然一般來說,堆記憶體的變量如果不指派的話,會有一個預設值,但是由于final的不可變特性,如果不指派的話理論上他會将預設值作為自己的值,并且固定不變這對于我們來說是毫無意義的,但其實如果final修飾的屬性不指派,他編譯時就會報錯。
  • final修飾屬性的時候,屬性還有一個資料類型,如果屬性的資料類型是基本資料類型,那麼final修飾後屬性值不會發生改變;如果屬性的資料類型是引用資料類型,那麼final修飾後屬性所引用的對象位址不能改變,但是這個對象裡面的變化就不歸final管了。(針對這一點使用以下代碼舉例)
public class Person{
	public final char[] name = {'I','T','小','白'}//利用引用類型的char數組來存放名字
	public final int age = 18;//利用基本資料類型的int存放年齡

	public static void main(String[] args){
		Person person = new Person();
		System.out.println("名字是:"+"person.name"+"年齡是:"+"person.age");
		//這時改變name數組中的值
	}
}
           
  1. 修飾方法

    由于final不可變特性,由final修飾的方法不可以被子類重寫。

  2. 修飾類

    當final修飾類本身的時候,很不幸o(╥﹏╥)o,這個類絕後了,成了一個太監類,專業術語叫無法被子類繼承,也就沒有子類。

    而我們通常常見的“太監類”多數為工具類,例如:Math、Scanner、Integer、String等

finally的用法

finally的出場要伴随着try和catch,finally是他們的一個可有可無的分支來先看一下這個結構,如下:

try {
		Thread.sleep(200);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}finally{
		System.out.println("或許我可有可無,但是一旦存在就必須執行!");
	}
           

finalize的用法

finalize()是Object的一個方法,作用在對象被GC回收時,預設調用執行的方法。

三者的差別

綜上所述,三者很容易區分,首先final這個關鍵字使我們最經常接觸的,是以他的用法在上面要好好記住,其次finally是跟try/catch相關的,記的時候跟他們聯系起來就好了,最後finalize是Object類的一個方法,把它和GC垃圾回收機制聯系起來就好了。