国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Java > 正文

詳解Java中的final關(guān)鍵字的使用

2019-11-26 15:02:57
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

final含義

final是Java中的一個(gè)保留關(guān)鍵字,可以聲明成員變量、方法和類(lèi)。一旦你將引用聲明為final類(lèi)型,你將不能再改變這個(gè)引用了。編譯器會(huì)檢查代碼,如果你試圖將變量再次初始化的話,編譯器會(huì)報(bào)編譯錯(cuò)誤。
final變量

凡是對(duì)成員變量或者本地變量(在方法中的或者代碼塊中的變量稱(chēng)為本地變量)聲明為final的都叫做final變量。下面是final修飾變量的例子:

final int constValue = 1;// constValue = 2; The final local variable constValue cannot be assigned.

補(bǔ)充點(diǎn):

  •     final成員變量必須在聲明的時(shí)候初始化或者在構(gòu)造函數(shù)中初始化,否則編譯器會(huì)報(bào)錯(cuò)。
  •     不能夠?qū)inal變量再次賦值。
  •     在匿名類(lèi)中所有變量都必須是final變量。

final方法

final也可以聲明方法。方法名前面加上final關(guān)鍵字,代表這個(gè)方法不可以被子類(lèi)重寫(xiě)。如果你認(rèn)為一個(gè)方法的功能已經(jīng)足夠完整了,子類(lèi)中不需要改變?cè)摲椒?,你就可以將該方法聲明為final類(lèi)型。
final聲明的方法比非final的方法快,因?yàn)樵诰幾g的時(shí)候就已經(jīng)靜態(tài)綁定了,不需要在運(yùn)行時(shí)再動(dòng)態(tài)綁定。下面是final方法的例子:

public class Person{  public final void printName() {    System.out.println("wangzhengyi");  }}


final類(lèi)

使用final來(lái)修飾的類(lèi)叫做final類(lèi)。final類(lèi)通常功能是完整的,它們不能被繼承。Java中許多類(lèi)是final的,例如String類(lèi)。

不可變類(lèi)的一個(gè)好處就是它自身是線程安全的,你不需要考慮多線程環(huán)境下的線程安全問(wèn)題。要?jiǎng)?chuàng)建不可變類(lèi),需要實(shí)現(xiàn)如下幾個(gè)步驟:

  •     將類(lèi)聲明為final,使它不能被繼承。
  •     將所有的成員聲明為私有的,這樣就不允許直接訪問(wèn)這些成員。
  •     對(duì)變量不要提供setter方法。
  •     將所有可變的成員聲明為final,這樣只能對(duì)它們賦值一次。
  •     通過(guò)構(gòu)造器初始化所有成員,進(jìn)行深拷貝(deep copy)。
  •     在getter方法中,不要直接返回對(duì)象本身,而是克隆對(duì)象,并返回對(duì)象的拷貝。

    注意:淺拷貝和深拷貝的區(qū)別:

        淺拷貝(淺克隆):被復(fù)制對(duì)象的所有變量都含有與原來(lái)的對(duì)象相同的值,而所有的對(duì)其他對(duì)象的引用仍然指向原來(lái)的對(duì)象。換言之,只復(fù)制對(duì)象的基本類(lèi)型,對(duì)象類(lèi)型仍屬于原來(lái)的引用。
        深拷貝(深克隆):被復(fù)制的所有變量都含有與原來(lái)的對(duì)象相同的值,除去那些引用其他對(duì)象的變量。那些引用其他對(duì)象的變量將指向被復(fù)制過(guò)的新對(duì)象,而不再是原有的那些被引用的對(duì)象。換言之,不僅復(fù)制對(duì)象的基本類(lèi)型,同時(shí)也復(fù)制原對(duì)象中的對(duì)象。

不可變類(lèi)示例:

import java.util.HashMap;import java.util.Iterator;public class FinalClassExample {  private final int id;  private final String name;  private final HashMap<Integer, String> hMap;  public int getId() {    return id;  }  public String getName() {    return name;  }  /**   * 可變對(duì)象的訪問(wèn)方法:返回對(duì)象的拷貝   * @return   */  public HashMap<Integer, String> gethMap() {    return (HashMap<Integer, String>)hMap.clone();  }  /**   * 實(shí)現(xiàn)深拷貝的構(gòu)造器   */  public FinalClassExample(int id, String name, HashMap<Integer, String> map) {    this.id = id;    this.name = name;    HashMap<Integer, String> tMap = new HashMap<Integer, String>();    int key;    Iterator<Integer> iterator = map.keySet().iterator();    while (iterator.hasNext()) {      key = iterator.next();      tMap.put(key, map.get(key));    }    this.hMap = tMap;  }  /**   * 實(shí)現(xiàn)淺拷貝構(gòu)造器   */  /*  public FinalClassExample(int id, String name, HashMap<Integer, String> map) {    this.id = id;    this.name = name;    this.hMap = map;  }  */}

final關(guān)鍵字好處

使用final關(guān)鍵字的優(yōu)勢(shì)如下:

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

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 侯马市| 张家港市| 平谷区| 玉田县| 沾益县| 瓮安县| 巴里| 梁山县| 启东市| 平江县| 清原| 上蔡县| 登封市| 北海市| 双鸭山市| 奎屯市| 呼玛县| 广宗县| 聂拉木县| 阿克陶县| 武鸣县| 永川市| 南川市| 赞皇县| 德阳市| 甘德县| 来凤县| 兴文县| 普洱| 集贤县| 象山县| 亳州市| 枣阳市| 沛县| 德令哈市| 通许县| 诸城市| 双柏县| 阜平县| 延寿县| 荥经县|