1. 程式人生 > >java final 關鍵字

java final 關鍵字

   根據上下文環境,java的關鍵字final也存在著細微的區別,但通常指的是“這是無法改變的。”不想改變的理由由兩種:一種是效率,另一種是設計。由於兩個原因相差很遠,所以關鍵子final可能被吳用。

   接下來介紹一下使用到fianl的三中情況:資料,方法,類。

   final資料

  許多程式語言都有某種方法,來向編譯器告知一塊資料是恆定不變的。有時資料的恆定不變是很有用的,例如:

1,一個編譯時恆定不變的常量

2,一個在執行時初始化,而你不希望它被改變。

   對於編譯期常量的這種情況,編譯器可以將該常量值代入任何可能用到它的計算式中,也就是說,可以在編譯期就執行計算式,這減輕了一些執行時的負擔。在java中,這類常量必須是基本型別,並且以final表示。在對這個常量定義時,必須進行賦值。

   一個即是static又是fianl的域只佔一段不能改變的儲存空間。

   當final應用於物件引用時,而不是基本型別時,其含義有些讓人疑惑。對基本型別使用fianl不能改變的是他的數值。而對於物件引用,不能改變的是他的引用,而物件本身是可以修改的。一旦一個final引用被初始化指向一個物件,這個引用將不能在指向其他物件。java並未提供對任何物件恆定不變的支援。這一限制也通用適用於陣列,它也是物件。

   下面的事例示範fianl域的情況。注意,根據慣例,即是static又是fianl的域(即編譯器常量)將用大寫表示,並用下劃分割個單詞:

     由於valueOne和VALUE_TWO都是帶有編譯時數值的fianl基本型別,所以它們二者均可以用作編譯期常量,並且沒有重大區別。VALUE_THREE是一種更加典型的對常量進行定義的方式:定義為public,可以被任何人訪問;定義為static,則強調只有一份;定義為fianl,這說明它是個常量。請注意帶有恆定初始值(即,編譯期常量)的final static基本型別全用大寫字母命名,並且字母與字母之間用下劃線隔開。

   我們不能因為某些資料是fianl的就認為在編譯時可以知道它的值。在執行時使用隨機數來初始化i4和INT_5的值叫說明了這一點。事例部分也展示了將fianl資料定義為static和非static的區別。此區別只有當數值在執行時內被初始化時才會顯現,這是因為在編譯器對編譯時的數值一視同仁(並且他們可能因為優化而消失)。當執行時會看見這個區別。請注意,在此fd1和fd2中i4的值是唯一的,每次都會被初始化為15,13。INT_5的值是不可以通過建立第二個FinalData物件加以改變的。這是因為他是static的,在裝載類時(也就是第一次建立這個類物件時)已經被初始化,而不是每次建立都初始化。


如果看上面的事例來理解我標記顏色的的部分有點困難的話,請看下面的事例:

 

啟動main()先執行的是B3 b1=new B3();,建立B3的第一個物件,這將會先初始化static final int INT_2= r.nextInt(100);,然後是初始化final int int1= r.nextInt(100);,所以第一條輸出語句的結果是int1:12    INT_2:66。接下來建立B3的第二個物件,這也會導致B3類中成員的初始化,但static final int INT_2= r.nextInt(100);不會在被初始化,為什麼前面已經提過。輸出的結果是int1:56    INT_2:66。兩次的輸出INT_2的值都是一樣的。

   在說回我們的第一個事例,V1到VAL_3說明final引用的意義。正如在main()方法中看見的,可以改變物件陣列a的值,但不能將a的引用指向另一個物件。看起來使基本型別成為fianl比引用型別成為final的用處大。

    java也許生成"空白final",所謂空白final是指被宣告為final但又未給初值的域。無論什麼情況下編譯器都會保證final域在使用前初始化。但空白final在fianl的使用上提供了很大的靈活性,為此,一個fianl域可以根據某些物件有所不同,卻又保持恆定不變的特性。下面的事例說明了一點。

 

final 引數

java中也許將引數列表中的引數以宣告的方式聲指明為final。這意味著你無發改變引數所指向的物件。

方法f()g()展示了基本型別的引數被指定為final是所出現的結果:你可以讀引數,但不能修改引數。這一特性只要用來向匿名內部類傳遞資料。

final 方法

   使用final方法有兩個原因。第一個原因是把方法鎖定,以防止任何繼承它的類修改它的含義。這是出於設計的考慮:想要確保在繼承中使用的方法保持不變,並且不會被覆蓋。

   過去建議使用final方法的第二個原因是效率。在java的早期實現中,如果將一個方法指明為fianl,就是同意編譯器將針對該方法的所有呼叫都轉為內嵌呼叫。當編譯器發現一個final方法呼叫命令時,它會根據自己的謹慎判斷,跳過插入程式程式碼這種正常的呼叫方式而執行方法呼叫機制(將引數壓入棧,跳至方法程式碼處執行,然後跳回並清理棧中的引數,處理返回值),並且以方法體中的實際程式碼的副本來代替方法呼叫。這將消除方法呼叫的開銷。當然,如果一個方法很大,你的程式程式碼會膨脹,因而可能看不到內嵌所帶來的效能上的提高,因為所帶來的效能會花費於方法內的時間量而被縮減。

    上面標顏色的地方不太懂。不知道那位看過Java程式設計思想和知道的高人給解釋解釋。

    在最進的java版本中,虛擬機器(特別是hotspot技術)可以探測到這些情況,並優化去掉這些效率反而降低的額外的內嵌呼叫,因此不再需要使用final方法來進行優化了。事實上,這種做法正逐漸受到勸阻。在使用java se5/6時,應該讓編譯器和JVM去處理效率問題,只有在想明確禁止覆蓋式,才將方法設定為fianl的。

    final和private關鍵字

   類中的所有private方法都是隱式的制定為final的。由於你無法訪問private方法你也就無法覆蓋它。可以對private方法新增final修飾詞,但這毫無意義。

     "覆蓋"只有在某方法是基類介面的一部分時才會發生。即,必須將一個物件向上轉型為它的基類並條用相同的方法。如果某方法是private的,它就不是基類介面的一部分。它僅是一些隱藏於類中的程式程式碼,如果一個基類中存在某個private方法,在派生類中以相同的名稱建立一個public,protected或包訪問許可權方法的話,該方法只不過是與基類中的方法有相同的名稱而已,並沒有覆蓋基類方法。由於private方法無法觸及且有很好的隱藏性,所以把它看成是因為他所屬類的組織結的原因而存在外,其他任何事物都不用考慮。

    final 類

    當將類定義為final時,就表明了你不打算繼承該類,而且也不也許別人這樣做。換句話說,出於某種考慮,你對該類的設計永不需要做任何變動,或者出於安全的考慮,你不希望他有子類。

    請注意,final類的域可以根據個人的意願選擇是或不是final。不論類是否被定義為final,相同的規則同樣適用於定義為final的域。然而,由於final是無法繼承的,所以被final修飾的類中的方法都隱式的制定為fianl,因為你無法覆蓋他們。在fianl類中可以給方法新增final,但這不會產生任何意義。

相關推薦

Java final關鍵字

替換 spa 一次 nal word val size add target final關鍵字不允許修改或替換其原始值或定義。final關鍵字可以在以下三個上下文中使用: 變量聲明 類聲明 方法聲明 final變量 如果一個變量被聲明為final,它只能被賦

java final 關鍵字 -- 常量部分

field 常量池 let line static value 標示 pub text java中final 定義常量有兩種方式,一種是靜態常量,一種是實例常量,下面分別介紹靜態常量的定義又可以分兩種情況:一種是定義時賦值,一種是靜態方法塊中賦值定義時賦值,如下代碼:/**

Java-final關鍵字

ide 覆蓋 繼承 子類 編譯器 bsp world hello str final:最終的,到此為止 分三種情況: 1、修飾類 表示該類不能被繼承和擴展 final class A {} class B extends A {}// 編譯器報錯,表示無法繼承 2、修

Java:final關鍵字

itl 訪問 width cal 一個 otto 圖片 class ont 首發日期:2018-03-24 final關鍵字: final的作用:相當於使修飾的變量、方法或類“固定、最終化”,使得修飾的變量、方法、類不能再做改變【可以限制繼承的重寫】。

java final關鍵字使用及面試題重點

java final關鍵字使用及面試題重點 1. 在java中宣告類、屬性和方法時,可以使用關鍵字final來修飾,表示“最終的”。 2.java 面試題final關鍵字知識點,例題 1. 在java中宣告類、屬性和方法時

java-final關鍵字修飾變數

       在java中,final關鍵字可以對類、方法以及變數進行修飾,這裡對final修飾變數進行一些探討。        final修飾的變數不可更改,其不可更改指的是其引用不可修改。看下列程式碼: StringBuffer sb1 = new StringBuf

Thinking in Java ---final關鍵字總結+初始化和類的載入

final關鍵字既可以用來修飾基本變數,引用也可以用來修飾方法和類。在修飾不同的物件時有不同的含義,很容易搞混淆,在此做一個小結。瞭解一下繼承情況下變數的初始化和類的載入機制,也能讓我們對程式執行時發生的一切有一個全域性性的把握。 一。final關鍵字

Java final關鍵字用來修飾類、方法、屬性

1.final修飾類:這個類不能被繼承。如:String類、StringBuffer類、System類。 2.final修飾方法:不能被重寫。如:Object類的getClass()方法。 3.final修飾屬性:此屬性就是一個常量,一旦初始化就不可再被賦值。習慣上,常用大

java final 關鍵字

   根據上下文環境,java的關鍵字final也存在著細微的區別,但通常指的是“這是無法改變的。”不想改變的理由由兩種:一種是效率,另一種是設計。由於兩個原因相差很遠,所以關鍵子final可能被吳用。    接下來介紹一下使用到fianl的三中情況:資料,方法,類。   

java final關鍵字作用

1.final修飾類的時候,這個類不能被不能被繼承,但是裡面的成員變數可以被修改 2.fianl修飾方法時。這個方法不能被重寫 3.final修飾變數時這個變數是常量不能被修改,而且使用這個變數時,必

深入java final關鍵字 基本用法、注意點和優點

本文講解final的基本用法和裡面的優缺點,原創不易,轉載請註明出處 文章分為3部分,分別會給大家介紹final關鍵字對類,方法和變數的修飾所起到的作用,以及一些優點,對於缺點大家可以參考《JAVA程式設計思想》第四版 156頁。 final類及其優點 f

Java final關鍵字、抽象類、接口

imp 最終 必須 true extend say 如果 ike 就是 final關鍵字在Java中被稱為完結器,表示最終的意思:final能聲明類、方法、屬性:1、使用final聲明的類不能被繼承;2、使用final聲明的方法不能被重寫;3、使用final聲明的變量變成常

java final關鍵字

聲明 關鍵字 方式 設置 3.1 實現 final類 重寫 改變 1.final聲明變量 一旦變量被設定,就不可再更改變量的值,通常final變量聲明的是常量。 eg:final double PI = 3.14; 2.final方法 final方法不能被重寫,將方

我去,你竟然還不會用 Java final 關鍵字

寫一篇文章容易嗎?太不容易了,首先,需要一個安靜的環境,這一點就非常不容易。很多小夥伴的辦公室都是開放式的,非常吵,況且上班時間寫的話,領導就不高興了;只能抽時間寫。其次,環境有了,還要有一顆安靜的心,如果心裡裝著其他揮之不去的事,那就糟糕了,呆坐著電腦前一整天也不會有結果。 我十分佩服一些同行,他們寫萬字長

JAVA中的final關鍵字

code out 繼承 style 事物 不能 void show 內部 final:最終 ,作為一個修飾符 可以修飾類,函數,變量 被final修飾的類不可以被繼承,為了避免被子類復寫功能 被final修飾的方法不能被復寫 被final修飾的變量是一個常量。只能被賦值一

java學習(六)面向對象 final關鍵字

hello int java學習 xtend 最終 .sh 方法 div ext 1.被fnial修飾的方法不能被重寫,常見的為修飾類,方法,變量 /* final可以修飾類,方法,變量 特點: final可以修飾類,該類不能被繼

5.4-全棧Java筆記:面向對象進階之對象的轉型 | FINAL關鍵字 |抽象方法和抽象類

java對象的轉型(casting)引用變量只能調用它編譯類型的方法,不能調用它運行類型的方法。這時,我們就需要進行類型的強制轉換!【示例1】對象的轉型public class TestCasting { public static void main(String[] args) {

Java的static和final關鍵字的用法

and logs png 大寫 內存地址 imp 自己 普通 字母 static關鍵字的用法   static的意思是“’靜態的”,在java裏面可用於修飾屬性和方法。   static關鍵字的應用應註意以下幾種情形:       1.static作用於某個字段,一個sta

Java學習筆記(二十三):final關鍵字

類繼承 ron 滿足 單詞 靜態 bsp 條件 str 進行 final關鍵字有三種使用場景: final修飾類 final修飾方法 final修飾變量 final修飾的類,不能再有子類繼承。 只要滿足以下條件就可以把一個類設計為final類: 不是專門為繼承而設

JAVA 基礎--final 關鍵字的用法

hang change nal class end strong rdquo gin java 基礎 在java中,final的含義在不同的場景下有細微的差別,in a word,它指的是“不可變的” 1.修飾數據。這裏的可以看到被final修飾的