程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 詳解Java中的final症結字的應用

詳解Java中的final症結字的應用

編輯:關於JAVA

詳解Java中的final症結字的應用。本站提示廣大學習愛好者:(詳解Java中的final症結字的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Java中的final症結字的應用正文


final寄義

final是Java中的一個保存症結字,可以聲明成員變量、辦法和類。一旦你將援用聲明為final類型,你將不克不及再轉變這個援用了。編譯器會檢討代碼,假如你試圖將變量再次初始化的話,編譯器會報編譯毛病。
final變量

但凡對成員變量或許當地變量(在辦法中的或許代碼塊中的變量稱為當地變量)聲明為final的都叫做final變量。上面是final潤飾變量的例子:

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

彌補點:

  •     final成員變量必需在聲明的時刻初始化或許在結構函數中初始化,不然編譯器會報錯。
  •     不克不及夠對final變量再次賦值。
  •     在匿名類中一切變量都必需是final變量。

final辦法

final也能夠聲明辦法。辦法名後面加上final症結字,代表這個辦法弗成以被子類重寫。假如你以為一個辦法的功效曾經足夠完全了,子類中不須要轉變該辦法,你便可以將該辦法聲明為final類型。
final聲明的辦法比非final的辦法快,由於在編譯的時刻就曾經靜態綁定了,不須要在運轉時再靜態綁定。上面是final辦法的例子:

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


final類

應用final來潤飾的類叫做final類。final類平日功效是完全的,它們不克不及被繼續。Java中很多類是final的,例如String類。

弗成變類的一個利益就是它本身是線程平安的,你不須要斟酌多線程情況下的線程平安成績。要創立弗成變類,須要完成以下幾個步調:

  •     將類聲明為final,使它不克不及被繼續。
  •     將一切的成員聲明為公有的,如許就不許可直接拜訪這些成員。
  •     對變量不要供給setter辦法。
  •     將一切可變的成員聲明為final,如許只能對它們賦值一次。
  •     經由過程結構器初始化一切成員,停止深拷貝(deep copy)。
  •     在getter辦法中,不要直接前往對象自己,而是克隆對象,並前往對象的拷貝。

    留意:淺拷貝和深拷貝的差別:

        淺拷貝(淺克隆):被復制對象的一切變量都含有與本來的對象雷同的值,而一切的對其他對象的援用依然指向本來的對象。換言之,只復制對象的根本類型,對象類型仍屬於本來的援用。
        深拷貝(深克隆):被復制的一切變量都含有與本來的對象雷同的值,除去那些援用其他對象的變量。那些援用其他對象的變量將指向被復制過的新對象,而不再是原本的那些被援用的對象。換言之,不只復制對象的根本類型,同時也復制原對象中的對象。

弗成變類示例:

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;
  }

  /**
   * 可變對象的拜訪辦法:前往對象的拷貝
   * @return
   */
  public HashMap<Integer, String> gethMap() {
    return (HashMap<Integer, String>)hMap.clone();
  }

  /**
   * 完成深拷貝的結構器
   */
  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;
  }

  /**
   * 完成淺拷貝結構器
   */
  /*
  public FinalClassExample(int id, String name, HashMap<Integer, String> map) {
    this.id = id;
    this.name = name;
    this.hMap = map;
  }
  */
}

final症結字利益

應用final症結字的優勢以下:

  •     final症結字進步了機能。JVM和Java運用都邑緩存final變量。
  •     final變量可以平安的在多線程情況下停止同享,而不須要額定的同步開支。
  •     應用final症結字,JVM會對辦法、變量和類停止優化。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved