真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Java中final關(guān)鍵字詳解及實(shí)例

 final在Java中可以聲明成員變量、方法、類(lèi)以及本地變量。一旦你將引用聲明作final,你將不能改變這個(gè)引用了,如果你試圖將變量再次初始化的話(huà),編譯器會(huì)報(bào)編譯錯(cuò)誤。
 final的含義在不同的場(chǎng)景下有細(xì)微的差別,但總體來(lái)說(shuō),它指的是“不可變”。

鹽都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)公司,鹽都網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為鹽都上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的鹽都做網(wǎng)站的公司定做!

1. final變量

凡是對(duì)成員變量或者本地變量(在方法中的或者代碼塊中的變量稱(chēng)為本地變量)聲明為final的都叫作final變量。final變量經(jīng)常和static關(guān)鍵字一起使用,作為常量。用final關(guān)鍵字修飾的變量,只能進(jìn)行一次賦值操作,并且在生存期內(nèi)不可以改變它的值。
不過(guò)在針對(duì)基本類(lèi)型和引用類(lèi)型時(shí),final關(guān)鍵字的效果存在細(xì)微差別。例如:

class Value {
  int v;
  public Value(int v) {
    this.v = v;
  }
}
public class FinalTest {
  final int f1 = 1;
  final int f2;
  public FinalTest() {
    f2 = 2;
  }
  public static void main(String[] args) {
    final int value1 = 1;
    // value1 = 4;
    final double value2;
    value2 = 2.0;
    final Value value3 = new Value(1);
    value3.v = 4;
  }
}

上面的例子中,main方法中被final修飾的數(shù)據(jù),在給value1賦初始值之后,我們無(wú)法再對(duì)value1的值進(jìn)行修改,final關(guān)鍵字起到了常量的作用。從value2我們可以看到,final修飾的變量可以不在聲明時(shí)賦值,即可以先聲明,后賦值。value3時(shí)一個(gè)引用變量,這里我們可以看到final修飾引用變量時(shí),只是限定了引用變量的引用不可改變,即不能將value3再次引用另一個(gè)Value對(duì)象,但是引用的對(duì)象的值是可以改變的。
另一方面,我們看到了用final修飾成員變量時(shí)的細(xì)微差別,因?yàn)閒inal修飾的數(shù)據(jù)的值是不可改變的,所以我們必須確保在使用前就已經(jīng)對(duì)成員變量賦值了。因此對(duì)于final修飾的成員變量,我們有且只有兩個(gè)地方可以給它賦值,一個(gè)是聲明該成員時(shí)賦值,另一個(gè)是在構(gòu)造方法中賦值,在這兩個(gè)地方我們必須給它們賦初始值。
最后我們需要注意的一點(diǎn)是,同時(shí)使用static和final修飾的成員在內(nèi)存中只占據(jù)一段不能改變的存儲(chǔ)空間。

2. final方法參數(shù)

前面我們可以看到,如果變量是我們自己創(chuàng)建的,那么使用final修飾表示我們只會(huì)給它賦值一次且不會(huì)改變變量的值。那么如果變量是作為參數(shù)傳入的,我們?cè)趺幢WC它的值不會(huì)改變呢?這就用到了final的第二種用法,即在我們編寫(xiě)方法時(shí),可以在參數(shù)前面添加final關(guān)鍵字,它表示在整個(gè)方法中,我們不會(huì)(實(shí)際上是不能)改變參數(shù)的值:

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

3. final方法

 final也可以聲明方法。方法前面加上final關(guān)鍵字,代表這個(gè)方法不可以被子類(lèi)的方法重寫(xiě)。如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了,子類(lèi)中不需要改變的話(huà),你可以聲明此方法為final。final方法比非final方法要快,因?yàn)樵诰幾g的時(shí)候已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定。關(guān)于private和final關(guān)鍵字還有一點(diǎn)聯(lián)系,這就是類(lèi)中所有的private方法都隱式地指定為是final的,由于無(wú)法在類(lèi)外使用private方法,所以也就無(wú)法覆蓋它。下面是final方法的例子:

class PersonalLoan{
  public final String getName(){
    return "personal loan";
  }
}
class CheapPersonalLoan extends PersonalLoan{
  @Override
  public final String getName(){
    return "cheap personal loan"; //compilation error: overridden method is final
  }
}

4. final類(lèi)

 使用final來(lái)修飾的類(lèi)叫作final類(lèi)。final類(lèi)通常功能是完整的,它們不能被繼承。Java中有許多類(lèi)是final的,譬如String, Interger以及其他包裝類(lèi)。下面是final類(lèi)的實(shí)例:

 final class PersonalLoan{
  }
  class CheapPersonalLoan extends PersonalLoan{ //compilation error: cannot inherit from final class

5. final關(guān)鍵字的好處

下面總結(jié)了一些使用final關(guān)鍵字的好處

  1. final關(guān)鍵字提高了性能。JVM和Java應(yīng)用都會(huì)緩存final變量。
  2. final變量可以安全的在多線(xiàn)程環(huán)境下進(jìn)行共享,而不需要額外的同步開(kāi)銷(xiāo)。
  3. 使用final關(guān)鍵字,JVM會(huì)對(duì)方法、變量及類(lèi)進(jìn)行優(yōu)化。

       創(chuàng)建不可變類(lèi)要使用final關(guān)鍵字。不可變類(lèi)是指它的對(duì)象一旦被創(chuàng)建了就不能被更改了。String是不可變類(lèi)的代表。不可變類(lèi)有很多好處,譬如它們的對(duì)象是只讀的,可以在多線(xiàn)程環(huán)境下安全的共享,不用額外的同步開(kāi)銷(xiāo)等等。

6. 幾個(gè)易混點(diǎn)

(1)類(lèi)的final變量和普通變量有什么區(qū)別?

當(dāng)用final作用于類(lèi)的成員變量時(shí),成員變量(注意是類(lèi)的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時(shí)或者構(gòu)造器中進(jìn)行初始化賦值,而且final變量一旦被初始化賦值之后,就不能再被賦值了。
那么final變量和普通變量到底有何區(qū)別呢?下面請(qǐng)看一個(gè)例子:

public class Test {
  public static void main(String[] args) {
    String a = "hello2"; 
    final String b = "hello";
    String d = "hello";
    String c = b + 2; 
    String e = d + 2;
    System.out.println((a == c));
    System.out.println((a == e));
  }
}

輸出結(jié)果:

true
false

 大家可以先想一下這道題的輸出結(jié)果。為什么第一個(gè)比較結(jié)果為true,而第二個(gè)比較結(jié)果為fasle。這里面就是final變量和普通變量的區(qū)別了,當(dāng)final變量是基本數(shù)據(jù)類(lèi)型以及String類(lèi)型時(shí),如果在編譯期間能知道它的確切值,則編譯器會(huì)把它當(dāng)做編譯期常量使用。也就是說(shuō)在用到該final變量的地方,相當(dāng)于直接訪(fǎng)問(wèn)的這個(gè)常量,不需要在運(yùn)行時(shí)確定。這種和C語(yǔ)言中的宏替換有點(diǎn)像。因此在上面的一段代碼中,由于變量b被final修飾,因此會(huì)被當(dāng)做編譯器常量,所以在使用到b的地方會(huì)直接將變量b 替換為它的 值。而對(duì)于變量d的訪(fǎng)問(wèn)卻需要在運(yùn)行時(shí)通過(guò)鏈接來(lái)進(jìn)行。想必其中的區(qū)別大家應(yīng)該明白了,不過(guò)要注意,只有在編譯期間能確切知道final變量值的情況下,編譯器才會(huì)進(jìn)行這樣的優(yōu)化,比如下面的這段代碼就不會(huì)進(jìn)行優(yōu)化:

public class Test {
  public static void main(String[] args) {
    String a = "hello2"; 
    final String b = getHello();
    String c = b + 2; 
    System.out.println((a == c));
  }
  public static String getHello() {
    return "hello";
  }
}

這段代碼的輸出結(jié)果為false。

(2) 被final修飾的引用變量指向的對(duì)象內(nèi)容可變嗎?

 在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對(duì)象,那么該引用變量指向的對(duì)象的內(nèi)容可變嗎?看下面這個(gè)例子:

public class Test {
  public static void main(String[] args) {
    final MyClass myClass = new MyClass();
    System.out.println(++myClass.i);
  }
}
class MyClass {
  public int i = 0;
}

這段代碼可以順利編譯通過(guò)并且有輸出結(jié)果,輸出結(jié)果為1。這說(shuō)明引用變量被final修飾之后,雖然不能再指向其他對(duì)象,但是它指向的對(duì)象的內(nèi)容是可變的。

(3) final和static

很多時(shí)候會(huì)容易把static和final關(guān)鍵字混淆,static作用于成員變量用來(lái)表示只保存一份副本,而final的作用是用來(lái)保證變量不可變??聪旅孢@個(gè)例子:

public class Test {
  public static void main(String[] args) {
    MyClass myClass1 = new MyClass();
    MyClass myClass2 = new MyClass();
    System.out.println(myClass1.i);
    System.out.println(myClass1.j);
    System.out.println(myClass2.i);
    System.out.println(myClass2.j);
  }
}
class MyClass {
  public final double i = Math.random();
  public static double j = Math.random();
}

 運(yùn)行這段代碼就會(huì)發(fā)現(xiàn),每次打印的兩個(gè)j值都是一樣的,而i的值卻是不同的。從這里就可以知道final和static變量的區(qū)別了。

7.總結(jié)

關(guān)于final的重要知識(shí)點(diǎn)有:

final關(guān)鍵字可以用于成員變量、本地變量、方法以及類(lèi)。
final成員變量必須在聲明的時(shí)候初始化或者在構(gòu)造器中初始化,否則就會(huì)報(bào)編譯錯(cuò)誤。
你不能夠?qū)inal變量再次賦值。
本地變量必須在聲明時(shí)賦值。
在匿名類(lèi)中所有變量都必須是final變量。
final方法不能被重寫(xiě)。
final類(lèi)不能被繼承。
final關(guān)鍵字不同于finally關(guān)鍵字,后者用于異常處理。
final關(guān)鍵字容易與finalize()方法搞混,后者是在Object類(lèi)中定義的方法,是在垃圾回收之前被JVM調(diào)用的方法。
接口中聲明的所有變量本身是final的。
final和abstract這兩個(gè)關(guān)鍵字是反相關(guān)的,final類(lèi)就不可能是abstract的。
final方法在編譯階段綁定,稱(chēng)為靜態(tài)綁定(static binding)。
沒(méi)有在聲明時(shí)初始化final變量的稱(chēng)為空白final變量(blank final variable),它們必須在構(gòu)造器中初始化,或者調(diào)用this()初始化。不這么做的話(huà),編譯器會(huì)報(bào)錯(cuò)“final變量(變量名)需要進(jìn)行初始化”。
將類(lèi)、方法、變量聲明為final能夠提高性能,這樣JVM就有機(jī)會(huì)進(jìn)行估計(jì),然后優(yōu)化。
按照J(rèn)ava代碼慣例,final變量就是常量,而且通常常量名要大寫(xiě):

private final int COUNT = 10;

對(duì)于集合對(duì)象聲明為final指的是引用不能被更改,但是你可以向其中增加,刪除或者改變內(nèi)容。譬如:

private final List Loans = new ArrayList();
list.add(“home loan”); //valid
list.add("personal loan"); //valid
loans = new Vector(); //not valid

以上所述是小編給大家介紹的Java中final關(guān)鍵字詳解及實(shí)例整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!


當(dāng)前名稱(chēng):Java中final關(guān)鍵字詳解及實(shí)例
分享路徑:http://weahome.cn/article/gddddc.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部