javafinal編譯
1. 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用來修飾成員變數和成員方法,可簡單理解為「全局常量」!
對於變數,表示一旦給值就不可修改,並且通過類名可以訪問。
對於方法,表示不可覆蓋,並且可以通過類名直接訪問。
2. Java里的final作用是什麼意思有是什麼大蝦解決下
Java中不能直接定義常量,但java提供了final關鍵字,被final關鍵字修飾的變數的值不能被修改,也就相當於定義了一個常量。對與java中的final變數,java編譯器是進行了優化的。每個使用了final類型變數的地方都不會通過連接而進行訪問
3. java 中final的作用是什麼啊
在方法參數前面加final關鍵字就是為了防止數據在方法體中被修改。這里主要分兩種情況:
第一,用final修飾基本數據類型;
第二,用final修飾引用類型。
第一種情況,修飾基本類型(非引用類型)。這時參數的值在方法體內是不能被修改的,即不能被重新賦值。否則編譯就通不過。例如: publicvoidtestInt(finalintparam1){ param1=100; } 在方法體內修改了基本數據類型變數的值,在Eclipse中則會提示:「 The final local variable param1 cannot be assigned. It must be blank and not using a compound assignment.「
第二種情況,修飾引用類型。這時參數變數所引用的對象是不能被改變的。作為引用的拷貝,參數在方法體裡面不能再引用新的對象。否則編譯通不過。
例如:
publicvoidtestFinal2
(
finalObjectparam2
){
param2=newObject();
}
在方法體內修改了參數的引用,在Eclipse中則會提示:
「 The final local variable param2 cannot be assigned. It must be blank and not using a compound assignment.「
4. 在Java中,final修飾符要如何使用
final,字面上的意思是「最後的,最終的」,在Java中表示同樣的含義。
final可以用來修飾變數、方法和類。
1.final修飾類
final修飾類時表示此類是「最後的、最終的」,即不能被繼承,不能擁有自己的子類。
如果試圖對一個已經用final修飾的類進行集成,則會在編譯期間發生錯誤。
2.final修飾方法
final修飾方法表示此方法已經是「最後的、最終的」含義,即此方法不能被重寫,但是可以被重載。PS:重寫的前提是子類可以繼承父類的方法,如果父類中final修飾的方法同時設置許可權為private,則會導致子類不能繼承此方法。但是,可以在子類中重新定義相同方法名和參數的方法,此時不會產生重寫與final的矛盾。而是在子類中重新定義了新的方法。因為父類中及被private又被final修飾的那個方法根本沒有被繼承,子類在重新定義這個同名同參數方法時不會發生編譯錯誤。
3.final修飾變數
final修飾的變數表示此變數是「最後的、最終的」。一旦定義了final變數並且在為其顯示初始化後,final修飾的變數值不可被改變。
注意Attention:
1、final修飾的變數,無論是類屬性、對象屬性、形參還是局部變數,這些變數都需要程序員顯示初始化,系統不會對final成員邊來那個進行隱式初始化。
final修飾局部變數,與為被final修飾的變數一樣,都需要顯示初始化。即局部變數都需要顯示初始化。
對一般的類屬性和對象屬性而言,首先都是先進行默認初始化,然後在對有顯示賦值的變數進行顯示初始化。
2、Java規定final修飾的類屬性和變數熟悉感必須要進行顯示初始化賦值。
3、無論是度與基本數據類型還是引用數據類型,final修飾的變數都是首次顯示初始化後就不能修改的。對於final修飾的基本數據類型,由於在編譯時就能確定該變數的至,於是吧該變數當做常量來處理。(常量命名規則:多個有意義的單詞連接是,所有字元大寫,單詞之間用下劃線分割)。對於final修飾的是引用數據類型,由於無法在編譯是獲得值,只能在運行時獲得值。引用變數指向的是實際的對象,但是存儲的是所指向對象的地址,因此,氣質不能修改以為著其所指向的對象不能修改,即指向哪一個只能一直指向他,不能指向別的對象,但是可以修改這個對象內的屬性。
5. java中的"final"關鍵字在多線程的語義中,有什麼含義
關於final的重要知識點
final關鍵字可以用於成員變數、本地變數、方法以及類。
final成員變數必須在聲明的時候初始化或者在構造器中初始化,否則就會報編譯錯誤。
你不能夠對final變數再次賦值。
本地變數必須在聲明時賦值。
在匿名類中所有變數都必須是final變數。
final方法不能被重寫。
final類不能被繼承。
final關鍵字不同於finally關鍵字,後者用於異常處理。
final關鍵字容易與finalize()方法搞混,後者是在Object類中定義的方法,是在垃圾回收之前被JVM調用的方法。
介面中聲明的所有變數本身是final的。
final和abstract這兩個關鍵字是反相關的,final類就不可能是abstract的。
final方法在編譯階段綁定,稱為靜態綁定(static binding)。
沒有在聲明時初始化final變數的稱為空白final變數(blank final variable),它們必須在構造器中初始化,或者調用this()初始化。不這么做的話,編譯器會報錯「final變數(變數名)需要進行初始化」。
將類、方法、變數聲明為final能夠提高性能,這樣JVM就有機會進行估計,然後優化。
按照Java代碼慣例,final變數就是常量,而且通常常量名要大寫:
private final int COUNT = 10;
6. java中final怎麼用
如果你想在類中使用一個恆定不變數,就可以使用final
如
public class Test {
private static final int x=100;
public static void main(String[] args) throws Exception {
x=2;//編譯錯誤
}
}
上面的x即是整個class的全部變數,下面x=2;在編譯的時候就會報錯,因為final修飾的變數是不能改變的,可以把x當做常量使用
7. Java中的final方法
java中 fianl方法,如果有子類,子類不能覆蓋該方法,因此這個方法修飾符 不能使abstract的。
8. java中final的用法
最終在Java中是不常見的,但它為我們提供的功能,例如在C語言中,常量的定義不僅如此,最終也允許你控制你的成員,方法或類是否可以被覆蓋或繼承功能,這些特點使得最終有在Java中一個不可缺少的角色,我們必須知道,當主鍵也學習Java。
類的,當你在關鍵字前面定義的變數加上最後的時候最後一個成員,也就是說,這個變數將不被一旦被初始化的改變,其中的含義不可變的基本類型其值是不可變的,它的對象的引用變數不再改變。其初始化可以在兩個地方,一個在它的定義,那就是直接說給他們的任務在最後的變數定義,二是在構造函數中。這兩個地方只能選其一,要麼在定義中給定的值,要麼在構造函數的值不能同時在定義給定值,並在構造函數中的另一個值。下面的代碼演示了這一點:
進口的java.util.List;
進口的java.util.ArrayList;
進口java.util.LinkedList中;
公共類蝙蝠{
最後PI = 3.14; / /在定義將使索引值
最終詮釋我; / /因為在構造函數中進行初始化,所以在這里我們不能給出一個值
最終名單列表; / /該變數也與上述相同的
蝙蝠(){
I = 100;
列表=新的LinkedList();
蝙蝠(INT二,表L){
I = II;
列表= 1;
公共靜態無效的主要(字串[] args){
蝙蝠B =新的蝙蝠();
b.list.add(新蝙蝠());
/ / BI = 25;
/ / b.list =新的ArrayList();
System.out.println(「i =」+雙+「列表類型:」+ b.list.getClass());
B =新的蝙蝠(23,新的ArrayList());
b.list.add(新蝙蝠());
System.out.println(「i =」+雙+「列表類型:」。+ b.list的getClass());
這個程序是非常簡單的一個常規用法最終的演示。這里初始化使用構造方法,它可以讓你有一點點的靈活性。如果兩個重載的構造函數蝙蝠所示,第一個預設構造函數提供默認值?你,重載的構造函數,根據最終的值初始化變數或鍵入你所提供的。然而,有時你並不需要這種靈活性,你只需要在給定的時間定義它並不會改變它的值,那麼你將無法使用此方法。有在main方法中陳述兩行被注釋掉了,如果你去掉注釋,程序將無法編譯,這就是說,無論是類型的值或列表我,一旦初始化,確實無法改變。然而,你可以通過重新初始化指定的雙值或列表的類型,輸出顯示:
我= 100名單類型:類java.util.LinkedList
I = 23名單類型:java的類。util.ArrayList
另一個用途是定義方法的參數是最終的,基本類型的變數,這種沒有任何實際意義,因為基本類型的變數,當調用方法是按值傳遞,這意味著你可以在這個參數變數的方法改變不影響調用語句,但對於對象變數,但它是非常有用的,因為對象是通過變數來傳遞它的引用,讓你在一個方法改變對象的變數也當你需要一個對象變數改變作為方法的參數,使用最終明確宣告影響通話聲明對象變數,它會防止你無意的影響到調用方法。
在內部類中方法參數的變數時使用另一種方法來更改這個參數也必須聲明為final在使用前,如下面的代碼所示:
公共類INClass {
無效,將InnerClass (最終字元串str){
類的iCLASS {
iCLASS非(){
System.out.println(STR);
iCLASS非IC =新的iCLASS();
公共靜態無效的主要(字串[] args){
INClass INC =新INClass();
inc.innerClass(「你好」;);
最後進近
該方法聲明為final,那就說明你已經知道這個方法提供的功能已經可以滿足你的要求,不需要進行擴展並且不會允許任何類,從這個類繼承重寫此方法,但你仍然可以繼承此方法的繼承,可以直接使用。另外還有一個已知的機制,內聯,它會使你的時候你直接調用的最後一個方法,方法體到呼叫時,而不是常規的方法調用,例如保存一個斷點,推等,這可能但是讓你的程序效率有所提高,當你接近拍攝對象是非常大的,或者如果你在很多地方調用此方法,那麼你的代碼會調用身體的迅速擴張,但可能會影響效率,所以你應該慎用最後進用該方法定義。
最後一類是最終當你的身體在課堂中使用時,您需要仔細考慮,因為一個final類不能被任何人繼承,這也意味著這樣的繼承樹是葉類,而這樣的設計已經考慮完善,而不需要或擴展。對於最終的類成員,您可以將其定義為final,可能不會被最終確認。因為他們的級決賽之間的關系作為法,自然成了最後的類型。您也可以掃清道路,以最後final類,但它顯然沒有任何意義。
下面的程序演示了final方法和final類的用法:
最終級決賽{
最後的字元串str =「最終數據」;
公共字元串STR1 =「非最終數據」;
最後的公共無效的print(){
System.out.println(「最後一個方法。」);
公共無效是什麼(){ System.out.println(STR +「\ n」+ str1的);
公共類FinalDemo {/ /最後的延伸不能繼承
公共靜態無效的主要(字串[] args){
最終F =新的最終();
f.what();
f.print();
由於可以從程序中可以看出,使用final類和普通類是幾乎沒有區別,但它失去了繼承的特性。最後的方法不同於非final方法很難從程序網上看到,只記得小心。
最終應用在設計模式
在設計模式中的模型,稱為不變的模式,java中可以很容易地通過final關鍵字實現這個模型,用來解釋它的最終成員程序時Bat.java是一個常數模式實例。如果你有興趣,你可以參考燕洪波誰寫的「Java與模式」一書來解釋。
9. 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被調用了");
//! }
}
此外,當一個方法被修飾為final方法時,意味著編譯器可能將該方法用內聯(inline)方式載入,所謂內聯方式,是指編譯器不用像平常調用函數那樣的方式來調用方法,而是直接將方法內的代碼通過一定的修改後到原代碼中(將方法主體直接插入到調用處,而不是進行方法調用)。這樣可以讓代碼執行的更快(因為省略了調用函數的開銷),比如在int[]
arr = new int[3]調用arr.length()等。
另一方面,私有方法也被編譯器隱式修飾為final,這意味著private final void
f()和private void f()並無區別。
4. 修飾類的final
當一個類被修飾為final時,它的含義很明確,就是不允許該類被繼承,也就是說,該類「絕後」了,任何繼承它的操作都會以編譯錯誤告終。這也凸顯出Java用final而不用const作為標識符的理由。(成員變數可以不是final,成員方法直接是final的)
示例:
public final class A {
}
// 編譯錯誤!A是final類型,不可被繼承!
//!public class B extends A{
//!}
5. 參數final
對對象參數做final修飾。以為對象變數傳遞的是其引用,為防止調用過程中無意的更改而修飾。
有好多人博客里邊有的。
10. JAVA中final的作用及意思
final在Java中並不常用,然而它卻為我們提供了諸如在C語言中定義常量的功能,不僅如此,final還可以讓你控制你的成員、方法或者是一個類是否可被覆寫或繼承等功能,這些特點使final在Java中擁有了一個不可或缺的地位,也是學習Java時必須要知道和掌握的關鍵字之一。
final成員
當你在類中定義變數時,在其前面加上final關鍵字,那便是說,這個變數一旦被初始化便不可改變,這里不可改變的意思對基本類型來說是其值不可變,而對於對象變數來說其引用不可再變。其初始化可以在兩個地方,一是其定義處,也就是說在final變數定義時直接給其賦值,二是在構造函數中。這兩個地方只能選其一,要麼在定義時給值,要麼在構造函數中給值,不能同時既在定義時給了值,又在構造函數中給另外的值。下面這段代碼演示了這一點:
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Bat{
final PI=3.14; //在定義時便給址值
final int i; //因為要在構造函數中進行初始化,所以此處便不可再給值
final List list; //此變數也與上面的一樣
Bat(){
i=100;
list=new LinkedList();
}
Bat(int ii,List l){
i=ii;
list=l;
}
public static void main(String[] args){
Bat b=new Bat();
b.list.add(new Bat());
//b.i=25;
//b.list=new ArrayList();
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
b=new Bat(23,new ArrayList());
b.list.add(new Bat());
System.out.println("I="+b.i+" List Type:"+b.list.getClass());
}
}
此程序很簡單的演示了final的常規用法。在這里使用在構造函數中進行初始化的方法,這使你有了一點靈活性。如Bat的兩個重載構造函數所示,第一個預設構造函數會為你提供默認的值,重載的那個構造函數會根據你所提供的值或類型為final變數初始化。然而有時你並不需要這種靈活性,你只需要在定義時便給定其值並永不變化,這時就不要再用這種方法。在main方法中有兩行語句注釋掉了,如果你去掉注釋,程序便無法通過編譯,這便是說,不論是i的值或是list的類型,一旦初始化,確實無法再更改。然而b可以通過重新初始化來指定i的值或list的類型,輸出結果中顯示了這一點:
I=100 List Type:class java.util.LinkedList
I=23 List Type:class java.util.ArrayList
還有一種用法是定義方法中的參數為final,對於基本類型的變數,這樣做並沒有什麼實際意義,因為基本類型的變數在調用方法時是傳值的,也就是說你可以在方法中更改這個參數變數而不會影響到調用語句,然而對於對象變數,卻顯得很實用,因為對象變數在傳遞時是傳遞其引用,這樣你在方法中對對象變數的修改也會影響到調用語句中的對象變數,當你在方法中不需要改變作為參數的對象變數時,明確使用final進行聲明,會防止你無意的修改而影響到調用方法。
另外方法中的內部類在用到方法中的參變數時,此參變也必須聲明為final才可使用,如下代碼所示:
public class INClass{
void innerClass(final String str){
class IClass{
IClass(){
System.out.println(str);
}
}
IClass ic=new IClass();
}
public static void main(String[] args){
INClass inc=new INClass();
inc.innerClass("Hello");
}
}
final方法
將方法聲明為final,那就說明你已經知道這個方法提供的功能已經滿足你要求,不需要進行擴展,並且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。另外有一種被稱為inline的機制,它會使你在調用final方法時,直接將方法主體插入到調用處,而不是進行例行的方法調用,例如保存斷點,壓棧等,這樣可能會使你的程序效率有所提高,然而當你的方法主體非常龐大時,或你在多處調用此方法,那麼你的調用主體代碼便會迅速膨脹,可能反而會影響效率,所以你要慎用final進行方法定義。
final類
當你將final用於類身上時,你就需要仔細考慮,因為一個final類是無法被任何人繼承的,那也就意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要進行修改或擴展。對於final類中的成員,你可以定義其為final,也可以不是final。而對於方法,由於所屬類為final的關系,自然也就成了final型的。你也可以明確的給final類中的方法加上一個final,但這顯然沒有意義。
下面的程序演示了final方法和final類的用法:
final class final{
final String str="final Data";
public String str1="non final data";
final public void print(){
System.out.println("final method.");
}
public void what(){
System.out.println(str+"\n"+str1);
}
}
public class FinalDemo { //extends final 無法繼承
public static void main(String[] args){
final f=new final();
f.what();
f.print();
}
}
從程序中可以看出,final類與普通類的使用幾乎沒有差別,只是它失去了被繼承的特性。final方法與非final方法的區別也很難從程序行看出,只是記住慎用。
final在設計模式中的應用
在設計模式中有一種模式叫做不變模式,在Java中通過final關鍵字可以很容易的實現這個模式,在講解final成員時用到的程序Bat.java就是一個不變模式的例子。如果你對此感興趣,可以參考閻宏博士編寫的《Java與模式》一書中的講解。