一、final
1、fianl可以修飾的內容
①修飾變數
- 如果是基本資料型別(int,double,char)變數那么表示這個變數是不可變的,即表示一個常量,通常是大寫
- 如果是參考型別(String,Date,Animal,Person)的變數那么表示這個參考只能指向初始化時指向的那個物件,不能在執行別的物件,但這個物件的
- fianl修飾的變數一定要有初始化的值且只能初始化一次,否則會報錯(還是編譯時錯誤)

②修飾類,表示這個類是最終類,是不可被繼承的,abstract與fianl是不能修飾同一個類的,因為當一個類被宣告為abstract后就是要被用來繼承,與fianl搭配是互相矛盾的,常見的fianl類有System,String…
③修飾方法,那么這個方法就不能被重寫,但不影響子類呼叫父類中的fianl方法,也不影響多載,fianl與abstract不能同時修飾一個方法,原因同②
2 fianl與String的搭配,先看題目
public class Main {
public static void main(String[] args) {
String a = "wzh2";
final String b = "wzh";
String d = "wzh";
String c = b + 2;
String e = d + 2;
System.out.println((a == c));
System.out.println((a == e));
}
}
這段代碼的輸出結果是什么呢?
答案是: true 和 false
1、變數a指的是字串常量池中的 wzh2;
2、變數 b 是 final 修飾的,變數 b 的值在編譯時候就已經確定了它的確定值,換句話說就是提前知道了變數 b 的內容到底是個啥,相當于一個編譯期常量;
3、變數 c 是 b + 2得到的,由于 b 是一個常量,所以在使用 b 的時候直接相當于使用 b 的原始值(wzh)來進行計算,所以 c 生成的也是一個常量,a 是常量,c 也是常量,都是 wzh2 ,而 Java 中常量池中只生成唯一的一個 wzh2 字串,所以 a 和 c 是相等的!
4、d 是指向常量池中 wzh,但由于 d 不是 final 修飾,也就是說在使用 d 的時候不會提前知道 d 的值是什么,所以在計算 e 的時候就不一樣了,e的話由于使用的是 d 的參考計算,變數d的訪問卻需要在運行時通過鏈接來進行,所以這種計算會在堆上生成wzh2 ,所以最終 e 指向的是堆上的 wzh2 , 所以 a 和 e 不相等,
總結:a、c是常量池的xiaomeng2,e是堆上的xiaomeng2
3、使用final的好處
- final方法比非final快一些
- final關鍵字提高了性能,JVM和Java應用都會快取final變數,
- final變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷,
- 使用final關鍵字,JVM會對方法、變數及類進行優化,
二、finally
1 用法:通常和try catch搭配使用,保證不管有沒有發生例外,資源都能夠被釋放(釋放連接、關閉IO流)
2 搭配return,不多廢話,直接看題
public class Test {
public static int test(){
int num = 10;
try {
return num += 80;
}catch (Exception e){
System.out.println(e);
}finally {
if(num > 20){
System.out.println("num>20,num=" +num);
}
return num;
}
}
public static void main(String[] args) {
System.out.println(test());
}
}
結果是:

原因是return num += 80被劃分為了兩步①num = num + 80② return num;但是在進入fianlly之前只是執行的①而沒有執行②,fianlly中的num已經變成了90,執行完fianlly后再執行return,也就是再執行②
public class Test {
public static int test(){
int num = 10;
try {
return num += 80;
}catch (Exception e){
System.out.println(e);
}finally {
num += 20;
return num;
}
}
public static void main(String[] args) {
System.out.println(test());
}
}
回傳結果是110,很簡單,如果fianlly與try中都有回傳值,那么try中的return會被覆寫,不再執行
三、Finalize:
Finalize是object類中的一個方法,子類可以重寫finalize()方法實作對資源的回收,垃圾回收只負責回收記憶體,并不負責資源的回收,資源回收要由程式員完成,Java虛擬機在垃圾回收之前會先呼叫垃圾物件的finalize方法用于使物件釋放資源(如關閉連接、關閉檔案),之后才進行垃圾回收,這個方法一般不會顯示的呼叫,在垃圾回收時垃圾回收器會主動呼叫,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/253074.html
標籤:java
