日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

導語

在JAVA的關鍵字中,staticfinal是兩個我們必須掌握的關鍵字。不同于其他關鍵字,他們都有多種用法,而且在一定環境下使用,可以提高程序的運行性能,優化程序的結構。

下面我們來了解一下final關鍵字及其用法。

夯實基礎:Java中final關鍵字的幾種用法

 

final關鍵字

在java中,final的含義在不同的場景下有細微的差別,但總體上來說,它指的是“這是不可變的”。下面,我們來講final的四種主要用法。

1.修飾數據

在編寫程序時,我們經常需要說明一個數據是不可變的,我們成為常量。在java中,用final關鍵字修飾的變量,只能進行一次賦值操作,并且在生存期內不可以改變它的值。更重要的是,final會告訴編譯器,這個數據是不會修改的,那么編譯器就可能會在編譯時期就對該數據進行替換甚至執行計算,這樣可以對我們的程序起到一點優化。不過在針對基本類型和引用類型時,final關鍵字的效果存在細微差別。我們來看下面的例子:

 1 class Value {
 2 int v;
 3 public Value(int v) {
 4 this.v = v;
 5 }
 6 }
 7 
 8 public class FinalTest {
 9 
10 final int f1 = 1;
11 final int f2;
12 public FinalTest() {
13 f2 = 2;
14 }
15 
16 public static void main(String[] args) {
17 final int value1 = 1;
18 // value1 = 4;
19 final double value2;
20 value2 = 2.0;
21 final Value value3 = new Value(1);
22 value3.v = 4;
23 }
24 }

上面的例子中,我們先來看一下main方法中的幾個final修飾的數據,在給value1賦初始值之后,我們無法再對value1的值進行修改,final關鍵字起到了常量的作用。從value2我們可以看到,final修飾的變量可以不在聲明時賦值,即可以先聲明,后賦值。value3時一個引用變量,這里我們可以看到final修飾引用變量時,只是限定了引用變量的引用不可改變,即不能將value3再次引用另一個Value對象,但是引用的對象的值是可以改變的,從內存模型中我們看的更加清晰:

夯實基礎:Java中final關鍵字的幾種用法

 

上圖中,final修飾的值用粗線條的邊框表示它的值是不可改變的,我們知道引用變量的值實際上是它所引用的對象的地址,也就是說該地址的值是不可改變的,從而說明了為什么引用變量不可以改變引用對象。而實際引用的對象實際上是不受final關鍵字的影響的,所以它的值是可以改變的。

另一方面,我們看到了用final修飾成員變量時的細微差別,因為final修飾的數據的值是不可改變的,所以我們必須確保在使用前就已經對成員變量賦值了。因此對于final修飾的成員變量,我們有且只有兩個地方可以給它賦值,一個是聲明該成員時賦值,另一個是在構造方法中賦值,在這兩個地方我們必須給它們賦初始值。

最后我們需要注意的一點是,同時使用static和final修飾的成員在內存中只占據一段不能改變的存儲空間。

2.修飾方法參數

前面我們可以看到,如果變量是我們自己創建的,那么使用final修飾表示我們只會給它賦值一次且不會改變變量的值。那么如果變量是作為參數傳入的,我們怎么保證它的值不會改變呢?這就用到了final的第二種用法,即在我們編寫方法時,可以在參數前面添加final關鍵字,它表示在整個方法中,我們不會(實際上是不能)改變參數的值:

public class FinalTest {
 /* ... */
 public void finalFunc(final int i, final Value value) {
 // i = 5; 不能改變i的值
 // v = new Value(); 不能改變v的值
 value.v = 5; // 可以改變引用對象的值
 }
}

3.修飾方法

第三種方式,即用final關鍵字修飾方法,它表示該方法不能被覆蓋。這種使用方式主要是從設計的角度考慮,即明確告訴其他可能會繼承該類的程序員,不希望他們去覆蓋這個方法。這種方式我們很容易理解,然而,關于private和final關鍵字還有一點聯系,這就是類中所有的private方法都隱式地指定為是final的,由于無法在類外使用private方法,所以也就無法覆蓋它。

4.修飾類

了解了final關鍵字的其他用法,我們很容易可以想到使用final關鍵字修飾類的作用,那就是用final修飾的類是無法被繼承的。

上面我們講解了final的四種用法,然而,對于第三種和第四種用法,我們卻甚少使用。這不是沒有道理的,從final的設計來講,這兩種用法甚至可以說是雞肋,因為對于開發人員來講,如果我們寫的類被繼承的越多,就說明我們寫的類越有價值,越成功。即使是從設計的角度來講,也沒有必要將一個類設計為不可繼承的。Java標準庫就是一個很好的反例,特別是Java 1.0/1.1中Vector類被如此廣泛的運用,如果所有的方法均未被指定為final的話,它可能會更加有用。如此有用的類,我們很容易想到去繼承和重寫他們,然而,由于final的作用,導致我們對Vector類的擴展受到了一些阻礙,導致了Vector并沒有完全發揮它應有的全部價值。

總結

final關鍵字是我們經常使用的關鍵字之一,它的用法有很多,但是并不是每一種用法都值得我們去廣泛使用。它的主要用法有以下四種:

  1. 用來修飾數據,包括成員變量和局部變量,該變量只能被賦值一次且它的值無法被改變。對于成員變量來講,我們必須在聲明時或者構造方法中對它賦值;
  2. 用來修飾方法參數,表示在變量的生存期中它的值不能被改變;
  3. 修飾方法,表示該方法無法被重寫;
  4. 修飾類,表示該類無法被繼承。

上面的四種方法中,第三種和第四種方法需要謹慎使用,因為在大多數情況下,如果是僅僅為了一點設計上的考慮,我們并不需要使用final來修飾方法和類。

分享到:
標簽:Java final
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定