『壹』 java中final修飾符可以分別用在什麼地方表示什麼意義
1,修飾類
當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
在使用final修飾類的時候,要注意謹慎選擇,除非這個類真的在以後不會用來繼承或者出於安全的考慮,盡量不要將類設計為final類。
2,修飾方法
被final修飾的方法將不能被子類覆蓋,主要用於1,把方法鎖定,以防任何繼承類修改它的含。2,在早期的Java實現版本中,會將final方法轉為內嵌調用,所以效率能夠提升
3,修飾變數
對於一個final變數,如果是基本數據類型的變數,則其數值一旦在初始化之後便不能更改;如果是引用類型的變數,則在對其初始化之後便不能再讓其指向另一個對象。
當用final作用於類的成員變數時,成員變數(注意是類的成員變數,局部變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變數一旦被初始化賦值之後,就不能再被賦值了。
『貳』 Java中final修飾的類有什麼作用
Java中,final關鍵字可以用來修飾類、方法和變數(包括成員變數和局部變數)。下面就從這三個方面來了解一下final關鍵字的基本用法。x0dx0a1.修飾類x0dx0a當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。x0dx0ax0dx0a在使用final修飾類的時候,要注意謹慎選擇,除非這個類真的在以後不會用來繼承或者出於安全的考慮,盡量不要將類設計為final類。x0dx0a2.修飾方法x0dx0a下面這段話摘自《Java編程思想》第四版第143頁:x0dx0a「使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。「x0dx0a因此,如果只有在想明確禁止 該方法在子類中被覆蓋的情況下才將方法設置為final的。x0dx0a註:類的private方法會隱式地被指定為final方法。x0dx0a3.修飾變數x0dx0a修飾變數是final用得最多的地方,也是本文接下來要重點闡述的內容。首先了解一下final變數的基本語法:x0dx0a對於一個final變數,如果是基本數據類型的變數,則其數值一旦在初始化之後便不能更改;如果是引用類型的變數,則在對其初始化之後便不能再讓其指向另一個對象。
『叄』 Java內部類引用外部類中的局部變數為何必須是final問題解析
今天編寫一個多線程程序,發現在方法內定義內部類時,如果內部類調用了方法中的變數,那麼該變數必須申明為final類型,百思不得其解,後來想到應該是生命周期的原因,因為方法內定義的變數是局部變數,離開該方法,變數就失去了作用,也就會自動被消除,而內部類卻不會離開它所在方法就失去作用,它有更廣的生命周期,下面通過一個實例加以說明:
如例中所示,在外部類Outer中聲明了一個內部類TimerPrint,這個類中的方法引用了方法start中的一個局部變數testTxt
邏輯上:因為該內部類出現在一個方法的內部,但實際編譯時,內部類編譯為Outer$1TimerPrint.class,這說明,外部類的這個方法和內部類是處於同一級別的。換句話說是非final變數和內部類的生命周期不一樣!start被調用後,非final變數也會隨之消失,就會出現內部類引用非法!
實際做法:java編譯器的行為是這樣的(前提條件是該變數在內部類中被引用):
若定義為final,則java編譯器則會在內部類TimerPrint內生成一個外部變數的拷貝,而且可以既可以保證內部類可以引用外部屬性,又能保證值的唯一性。
若不定義為final,則
無法通過編譯!(
jdk1.6測試過)。
因為編譯器不會給非final變數進行拷貝,那麼
內部類引用的變數就是非法的!
下面看經過編譯以後的位元組碼:
外部類編譯後的位元組碼:
內部類編譯後的位元組碼:
如果外部類中的變數d沒有被內部類引用,則final為可選的,而且
java編譯器將不做特殊處理!!
加一個參數d 並且把它定義為非final類型,編譯以後文件如下:
編譯後的外部類class:
編譯後的內部類class:
由上可以看出,在方法內部定義內部類時,內部類如果調用了方法內的變數,則該變數必須被final修飾,否則就會因為在調用內部類時因為找不到所用的變數而報錯!
『肆』 java中final關鍵字作用是
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會再被擴展,那麼就設計為final類。 final方法不能被子類的方法覆蓋,但可以被繼承。 2、final方法 如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。 使用final方法的原因有二: 第一、把方法鎖定,防止任何繼承類修改它的意義和實現。 第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。 3、final變數(常量) 用final修飾的成員變數表示常量,只能被賦值一次,賦值後值無法改變! final修飾的變數有三種:靜態變數、實例變數和局部變數,分別表示三種類型的常量。 從下面的例子中可以看出,一旦給final變數初值後,值就不能再改變了。 另外,final變數定義的時候,可以先聲明,而不給初值,這種變數也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同,卻有保持其恆定不變的特徵。 4、final參數 當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。 註:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。 final不能用於修飾構造方法。
『伍』 什麼叫final修飾符有什麼作用
final是Java關鍵字 final所標記的成分具有終態的特徵,表示最終的意思。
作用:
當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類永遠不會讓它被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
(5)java中final修飾局部變數擴展閱讀:
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會再被擴展,那麼就設計為final類。 final方法不能被子類的方法覆蓋,但可以被繼承。
用final修飾的成員變數表示常量,只能被賦值一次,賦值後值無法改變!
final修飾的變數有三種:靜態變數、實例變數和局部變數,分別表示三種類型的常量。