final/finalize/finally的區別


一、性質不同

(1)final為關鍵字;

(2)finalize()為方法;

(3)finally為為區塊標志,用於try語句中;

二、作用

(1)final為用於標識常量的關鍵字,final標識的關鍵字存儲在常量池中(在這里final常量的具體用法將在下面進行介紹);

(2)finalize()方法在Object中進行了定義,用於在對象“消失”時,由JVM進行調用用於對對象進行垃圾回收,類似於C++中的析構函數;用戶自定義時,用於釋放對象占用的資源(比如進行I/0操作);

(3)finally{}用於標識代碼塊,與try{}進行配合,不論try中的代碼執行完或沒有執行完(這里指有異常),該代碼塊之中的程序必定會進行;

三、final詳解

1定義變量

1.1  final定義基本類型變量時,要求變量初始化必須在聲明時或者構造函數中,不能用於其它地方。該關鍵字定義的常量,除了初始化階段,不能更改常量的值。

1.2  final定義對象的引用,該引用的初始化與定義常量時的要求一致;該關鍵字定義的對象內容可以改變,但是引用指向的地址不能改變;

2定義參數

如果傳入該參數定義的變量時,方法不能對該參數內容進行修改(錯誤),與定義變量的修改規則相同;java方法中傳遞基本類型時是傳值的,java方法對於對象的傳遞是傳參的;<歸根結底,java中方法的傳遞是依靠傳遞“副本”:對於基本類型,首先建立一個Copy,並將傳入的賦值給Copy,然后對Copy進行操作;對於對象類型,首先建立一個引用Copy,並將傳入的對象引用賦值給Copy>

比如:method(final int test);

有些書上說,這里final定義參數,尤其是對象的參數很有作用,不能在方法內對於對象的內容進行改變,這樣的說法是錯誤的!原來我也認為這樣有些函數式編程的特點,不能對於對象的內容進行修改該,這里依舊可以對對象的內容進行修改。

??定義該參數有什么用??

String天生就是final類型的!

3定義方法

(1)使用final關鍵字定義的方法,不能被子類繼承;

(2)允許編譯器將所有對此方法的調用轉化為inline(行內)行為,即可以將此方法直接復制在調用處,而不是進行例行的方法調用(保存斷點、壓棧),這樣會使程序的效率升高。但是---------如果過多的話,這樣會造成代碼膨脹,反而會影響效率,所以該方法要慎用。。

4定義類

一個任何final類無法被任何人繼承,這也就意味着此類在一個繼承樹中是一個葉子類,並且此類被認為是很完美的,不需要進行任何修改(總之是不推薦使用)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM