final在java
1. java中final修飾符可以分別用在什麼地方表示什麼意義
1,修飾類
當用final修飾一個類時,表明這個類不能被繼承。也就是說,如果一個類你永遠不會讓他被繼承,就可以用final進行修飾。final類中的成員變數可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
在使用final修飾類的時候,要注意謹慎選擇,除非這個類真的在以後不會用來繼承或者出於安全的考慮,盡量不要將類設計為final類。
2,修飾方法
被final修飾的方法將不能被子類覆蓋,主要用於1,把方法鎖定,以防任何繼承類修改它的含。2,在早期的Java實現版本中,會將final方法轉為內嵌調用,所以效率能夠提升
3,修飾變數
對於一個final變數,如果是基本數據類型的變數,則其數值一旦在初始化之後便不能更改;如果是引用類型的變數,則在對其初始化之後便不能再讓其指向另一個對象。
當用final作用於類的成員變數時,成員變數(注意是類的成員變數,局部變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變數一旦被初始化賦值之後,就不能再被賦值了。
2. Java中final 一般是什麼作用,什麼情況用
1. 修飾基礎數據成員的final
這是final的主要用途,其含義相當於C/C++的const,即該成員被修飾為常量,意味著不可修改。如java.lang.Math類中的PI和E是final成員,其值為3.141592653589793
和2.718281828459045。
2. 修飾類或對象的引用的final
在Java中,我們無法讓對象被修飾為final,而只能修飾對象的引用,這意味著即使你寫public final A a = new A(); 事實上a指向的對象的數據依然可以被修改,不能修改的是a本身的引用值,即你不能再對a進行重賦值。同樣的情況出現在數組中,比如public final int[] a = {1, 2, 3, 4, 5},事實上a中的數值是可修改的,即可以寫a[0] = 3。據目前了解,java中數組內的數據是無法修飾為不可修改的,而C/C++可以。
3. 修飾方法的final
修飾方法的final和C/C++中修飾成員對象的const大不相同。首先,修飾方法的final含義不是「不可修改」,而是指該方法不可被繼承成員重新定義。(注意,這里所說的不能被重新定義,並不是指子類一定不能定義同名方法,如果父類的方法是私有類型,子類是允許定義該方法的,這里指的不能重新定義是指不能通過改寫方法來使得方法重寫的多態性得以實現,如不希望A a = new B(); a.f();這樣的重寫方法情況出現)
示例:
public class A {
// final方法f
public final void f() {
System.out.println("類A中的final方法f被調用了");
}
}
public class B extends A {
// 編譯錯誤!父類的f方法是final類型,不可重寫!
//! public void f() {
//! System.out.println("類B中的方法f被調用了");
//! }
}
3. final在Java里是什麼意思
final在java中的意思是表示最終的,無法改變的意思。
1.
final
定義數值表示這個數值是最終的,不可改變的,一旦改變是會出錯的,當用final作用於類的成員變數時,成員變數(注意是類的成員變數,局部變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值,而且final變數一旦被初始化賦值之後,就不能再被賦值了。。
2.
final
定義方法表示這個方法是不能被重寫和重載的只能夠被子類繼承使用,使用final方法的原因有兩個。第一個原因是把方法鎖定,以防任何繼承類修改它的含義;第二個原因是效率。在早期的Java實現版本中,會將final
方法轉為內嵌調用。但是如果方法過於龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。
3.
final
定義類便是這個類是最終的,是不能夠被繼承的,類中的方法也都是默認修飾了final方法,注意final類中的成員變數可以根據需要設為final。
4. final關鍵字在java中有哪些用法
1、final類
final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴展,那麼就設計為final類。
2、final方法
如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。
使用final方法的原因有二:
第一、把方法鎖定,防止任何繼承類修改它的意義和實現。
第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。
3、final變數(常量)
用final修飾的成員變數表示常量,值一旦給定就無法改變!
final修飾的變數有三種:靜態變數、實例變數和局部變數,分別表示三種類型的常量。
另外,final變數定義的時候,可以先聲明,而不給初值,這中變數也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同,卻有保持其恆定不變的特徵。
4、final參數
當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。
5、static和final一塊用表示什麼
static final用來修飾成員變數和成員方法,可簡單理解為「全局常量」!
對於變數,表示一旦給值就不可修改,並且通過類名可以訪問。
對於方法,表示不可覆蓋,並且可以通過類名直接訪問。
5. java 中的 final 關鍵字有哪些用法
(1)修飾變數
用final關鍵字修飾的變數,只能進行一次賦值操作,並且在生存期內不可以改變它的值。final 修飾的變數可以先聲明,後賦值。
final修飾基本類型時,起到常量的作用,基本類型的值不可變。
final修飾引用類型時,不能再指向其他的對象,但被引用的對象的值是可以改變的(引用變數的值
實際上是它所引用的對象的地址)。
當用final作用於類的成員變數時,成員變數(局部變數只需要保證在使用之前被初始化賦值即可)必須在定義時或者構造器中進行初始化賦值。
(2)修飾方法參數
編寫方法時,可以在參數前面添加final關鍵字,它表示在整個方法中,不會(實際上是不能)改變參數的值,具體類似於修飾數據。
即不能改變參數的值,但是可以改變引用類型參數的對象的值。同時,即使沒有final的修飾,參數的改變也不會影響到方法外的變數。
(3)修飾方法
final關鍵字修飾方法,它表示該方法不能被覆蓋(重寫)。另外,類中所有的private方法都隱式地指定為是final的,由於無法在類外使用private方法,所以也就無法覆蓋它。此時可以在子類中定義相同的方法名和參數,這種情況不再產生重寫與final的矛盾,而是在子類中重新定義了新的方法。可以對private方法添加final修飾符,但並沒有添加任何額外意義。
(4) 修飾類
用final修飾的類是無法被繼承的。且final類中的所有成員方法都會被隱式地指定為final方法。
6. java中final,finally和finalize的區別
1. final
在java中,final可以用來修飾類,方法和變數(成員變數或局部變數)。下面將對其詳細介紹。
1.1 修飾類
當用final修飾類的時,表明該類不能被其他類所繼承。當我們需要讓一個類永遠不被繼承,此時就可以用final修飾,但要注意:
final類中所有的成員方法都會隱式的定義為final方法。
1.2 修飾方法
使用final方法的原因主要有兩個:
(1) 把方法鎖定,以防止繼承類對其進行更改。
(2) 效率,在早期的java版本中,會將final方法轉為內嵌調用。但若方法過於龐大,可能在性能上不會有多大提升。因此在最近版本中,不需要final方法進行這些優化了。
final方法意味著「最後的、最終的」含義,即此方法不能被重寫。
注意:若父類中final方法的訪問許可權為private,將導致子類中不能直接繼承該方法,因此,此時可以在子類中定義相同方法名的函數,此時不會與重寫final的矛盾,而是在子類中重新地定義了新方法。
1.3 修飾變數
final成員變數表示常量,只能被賦值一次,賦值後其值不再改變。類似於C++中的const。
當final修飾一個基本數據類型時,表示該基本數據類型的值一旦在初始化後便不能發生變化;如果final修飾一個引用類型時,則在對其初始化之後便不能再讓其指向其他對象了,但該引用所指向的對象的內容是可以發生變化的。本質上是一回事,因為引用的值是一個地址,final要求值,即地址的值不發生變化。
final修飾一個成員變數(屬性),必須要顯示初始化。這里有兩種初始化方式,一種是在變數聲明的時候初始化;第二種方法是在聲明變數的時候不賦初值,但是要在這個變數所在的類的所有的構造函數中對這個變數賦初值。
當函數的參數類型聲明為final時,說明該參數是只讀型的。即你可以讀取使用該參數,但是無法改變該參數的值。
2. finally
finally作為異常處理的一部分,它只能用在try/catch語句中,並且附帶一個語句塊,表示這段語句最終一定會被執行(不管有沒有拋出異常),經常被用在需要釋放資源的情況下。(×)(這句話其實存在一定的問題)
很多人都認為finally語句塊一定會執行,但真的是這樣么?答案是否定的,例如下面這個例子:
只有與finally對應的try語句塊得到執行的情況下,finally語句塊才會執行。以上兩種情況在執行try語句塊之前已經返回或拋出異常,所以try對應的finally語句並沒有執行。
3. finalize
finalize()是在java.lang.Object里定義的,也就是說每一個對象都有這么個方法。這個方法在gc啟動,該對象被回收的時候被調用。其實gc可以回收大部分的對象(凡是new出來的對象,gc都能搞定,一般情況下我們又不會用new以外的方式去創建對象),所以一般是不需要程序員去實現finalize的。
特殊情況下,需要程序員實現finalize,當對象被回收的時候釋放一些資源,比如:一個socket鏈接,在對象初始化時創建,整個生命周期內有效,那麼就需要實現finalize,關閉這個鏈接。
使用finalize還需要注意一個事,調用super.finalize();
一個對象的finalize()方法只會被調用一次,而且finalize()被調用不意味著gc會立即回收該對象,所以有可能調用finalize()後,該對象又不需要被回收了,然後到了真正要被回收的時候,因為前面調用過一次,所以不會調用finalize(),產生問題。 所以,推薦不要使用finalize()方法,它跟析構函數不一樣。
7. 在Java中,final修飾符要如何使用
java語言定義了public、protected、private、abstract、static和final這6常用修飾詞外還定義了5個不太常用的修飾詞,下面是對這11個java修飾詞的介紹:
1.public
使用對象:類、介面、成員
介紹:無論它所處在的包定義在哪,該類(介面、成員)都是可訪問的
2.private
使用對象:成員
介紹:成員只可以在定義它的類中被訪問
3.static
使用對象:類、方法、欄位、初始化函數
介紹:成名為static的內部類是一個頂級類,它和包含類的成員是不相關的。靜態方法是類方法,是被指向到所屬的類而不是類的實例。靜態欄位是類欄位,無論該欄位所在的類創建了多少實例,該欄位只存在一個實例被指向到所屬的類而不是類的實例。初始化函數是在裝載類時執行的,而不是在創建實例時執行的。
4.final
使用對象:類、方法、欄位、變數
介紹:被定義成final的類不允許出現子類,不能被覆蓋(不應用於動態查詢),欄位值不允許被修改。
5.abstract
使用對象:類、介面、方法
介紹:類中包括沒有實現的方法,不能被實例化。如果是一個abstract方法,則方法體為空,該方法的實現在子類中被定義,並且包含一個abstract方法的類必須是一個abstract類
6.protected
使用對象:成員
介紹:成員只能在定義它的包中被訪問,如果在其他包中被訪問,則實現這個方法的類必須是該成員所屬類的子類。
7.native
使用對象:成員
介紹:與操作平台相關,定義時並不定義其方法,方法的實現被一個外部的庫實現。
8.strictfp
使用對象:類、方法
介紹:strictfp修飾的類中所有的方法都隱藏了strictfp修飾詞,方法執行的所有浮點計算遵守ieee
754標准,所有取值包括中間的結果都必須表示為float或double類型,而不能利用由本地平台浮點格式或硬體提供的額外精度或表示範圍。
9.synchronized
使用對象:方法
介紹:對於一個靜態的方法,在執行之前jvm把它所在的類鎖定;對於一個非靜態類的方法,執行前把某個特定對象實例鎖定。
10.volatile
使用對象:欄位
介紹:因為非同步線程可以訪問欄位,所以有些優化操作是一定不能作用在欄位上的。volatile有時可以代替synchronized。
11.transient
使用對象:欄位
介紹:欄位不是對象持久狀態的一部分,不應該把欄位和對象一起串起。
8. Java中final有什麼用
根據程序上下文環境,Java關鍵字final有「這是無法改變的」或者「終態的」含義,它可以修飾非抽象類、非抽象類成員方法和變數。
final類不能被繼承,沒有子類,final類中的方法默認是final的。
final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變數表示常量,只能被賦值一次,賦值後值不再改變。
final不能用於修飾構造方法。
注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。
9. JAVA中final的作用及意思分別是什麼
final方法
將方法聲明為final,那就說明你已經知道這個方法提供的功能已經滿足你要求,不需要進行擴展。
final是JAVA的一個關鍵字有:final類final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。
10. java中的final
使用final關鍵字定義常量,常量名不區分大小寫。但是統一將常量名用大寫來表示可以增強代碼的可讀性。別人閱讀你的代碼時一看是大寫的就知道它是一個常量。它僅僅是SUN建議大家這樣做,Java底層類庫源碼本身也是採用常量名為大寫形式的,例如:
privatestaticfinalintDEFAULT_CAPACITY=10;