final
修飾符(關(guān)鍵字)如果一個類被聲明為final,意味著它不能再派生出新的子類,不能作為父類被繼承。因此一個類不能既被聲明為 abstract的,又被聲明為final的。將變量或方法聲明為final,可以保證它們在使用中不被改變。被聲明為final的變量必須在聲明或者初始化塊、構(gòu)造器等給定初值,而在以后的引用中只能讀取,不可修改。
1. final類
final修飾的類不能夠被繼承,也就不會有子類。
2. final方法
final修飾的方法是不能夠被重寫的。
但是存在一個特殊的情況,當(dāng)父類中的方法同時被final private修飾時,在子類中時可以有同名方法的。因為當(dāng)父類方法被private修飾的時候,子類是訪問不到這個方法,在子類看來,父類的這個方法是不存在的,所以子類中可以產(chǎn)生一個與父類同名的方法,這兩個方法之間是沒有任何關(guān)系的。
此外,final修飾的方法只是不能夠被重寫,但是能夠被重載。
class Fruit{
final static public void test() {
System.out.println("這是沒有被子類覆蓋的方法");
}
}
public class Banana extends Fruit{
public void test() { //此處報錯,被重寫的方法不能夠是final修飾的方法
}
final public static void call(final String name) {
System.out.println("正在撥打" + " " + name + "的電話");
}
final public static void call(int num) { //此處無報錯,說明final方法是可以被重載的
System.out.println("這是被重載的方法");
}
public static void main(String[] args) {
}
}
3. final變量
- final成員變量
類變量必須在靜態(tài)初始化塊或者聲明時指定初始值,兩個地方選擇一個。
實例變量必須在非靜態(tài)初始化塊、構(gòu)造器、聲明時指定初始值,三者之間選擇一個。
- final局部變量
局部變量既可以在定義的時候指定初始值,也可以在后面代碼中指定初始值,兩個位置只能選擇一次。此外當(dāng)方法的形參使用final修飾的時候,由系統(tǒng)傳入的參數(shù)進(jìn)行初始化,在方法內(nèi)部不能夠?qū)υ搮?shù)重新賦值。
static public void call(final String name) {
System.out.println("正在撥打" + " " + name + "的電話");
name = "一個名字"; //此處賦值出錯
}
finally
finally塊一般被用于異常處理快中,異常處理時提供 finally 塊來執(zhí)行任何清除操作。如果拋出一個異常,那么相匹配的 catch 子句就會執(zhí)行,然后控制就會進(jìn)入 finally 塊(如果有的話)。
finally塊只要出現(xiàn),就一定會被執(zhí)行,不管它是否出現(xiàn)了異常。
有兩種特殊情況需要注意:
- 一般情況下,在
catch塊中使用return會強(qiáng)制結(jié)束方法,但是在存在finally塊的情況下,要先執(zhí)行finally塊中的語句,然后再執(zhí)行return。 - 如果在異常處理語句中使用
System.exit(1)來退出虛擬機(jī),finally塊中語句將不會被執(zhí)行。 - 如果在
finally塊中使用了return或者throw語句,則會在finally塊中直接終止,不再執(zhí)行catch塊中的語句,所以不推薦在finally塊中使用return和throw。
finalize
Java 允許使用finalize()方法在垃圾收集器將對象從內(nèi)存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調(diào)用的。它是在Object類中定義的,因此所有的類都繼承了它。子類覆蓋finalize()方法以整理系統(tǒng)資源或者執(zhí)行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調(diào)用的。 當(dāng)垃圾回收器(garbage colector)決定回收某對象時,就會運行該對象的finalize()方法。
總結(jié)
- final:是用來修飾類、方法、變量的。修飾類的,該類不能被修改繼承。修飾變量時,變量必須被顯式初始化,在初始化塊中或者構(gòu)造器或者聲明時賦值。修飾方法時,該方法不能被重寫,但是能夠被重載。
- finally:是在異常處理中使用,在catch語句中不使用
System.exit(1)時,一定會被執(zhí)行。 - finalize:在對象被回收前使用執(zhí)行清理工作。