91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java用final修飾數據的過程

發布時間:2021-08-26 20:21:28 來源:億速云 閱讀:159 作者:chen 欄目:編程語言

這篇文章主要講解了“Java用final修飾數據的過程”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java用final修飾數據的過程”吧!

final是Java中的一個重要關鍵字,它可以修飾數據、方法和類,本篇將從final修飾的數據角度對final做出總結。

final修飾的數據代表著:永遠不變。意思是,一旦你用final修飾一塊數據,你之后就只能看看它,你想修改它,沒門。我們不希望改變的數據有下面兩種情況:

永不改變的編譯時常量。

//編譯時知道其值private final int valueOne = 9;

在運行時(不是編譯時)被初始化的值,且之后不希望它改變。

//在編譯時不能知道其值private final int i4 = rand.nextInt(20);

設置成常量有啥好處呢?

很簡單,讓編譯器覺得簡單,就是最大的好處。比如把PI設置成final,且給定值為3.14,編譯器自然會覺得這個東西不會再被修改了,是足夠權威的。那么,編譯器就會在運行之前(編譯時)就把這3.14代入所有的PI中計算,這樣在真正運行的時候,速度方面當然會快一點。

有初始值的final域

即聲明為final且當場就給定初始值的域。

private final int valueOne = 9;

final+基本數據類型

final修飾的基本數據類型變量存儲的數值永恒不變。

/*基本類型變量*///帶有編譯時數值的final基本類型private final int valueOne = 9;private static final int VALUE_TWO = 99;public static final int VALUE_THREE = 39;//!false:fd1.valueOne++;//!false:fd1.VALUE_TWO++;//!false:fd1.VALUE_THREE++;

康康上面醒目的三句false語句,很好地印證了我們之前說的:數值不讓改!!!

需要注意的是,按照慣例,下面是定義常量的典型方式:

//典型常量的定義方式public static final int VALUE_THREE = 39;

public修飾符使其可被用于包之外。  static使數據只有一份。  final表示其無法被更改  名稱全為大寫英文字母,以下劃線隔開。

final+引用數據類型

我們之前說過,基本類型存數值,引用類型存地址值。那么既然final+基本數據類型不讓改數值,聰明的我們稍微一聯想就明白,final+引用數據類型就是不讓你改變量存儲實際對象的地址值啦。(也就是不能再讓它指向新的對象,很專一)

private Value v1 = new Value(1);private final Value v2 = new Value(22);private static final Value V_3 = new Value(333);//引用變量并不是常量,存儲地址可以改變fd1.v1 = new Value(10);//v2是引用變量,final修飾之后表示地址不能改變,但是實際對象的值是可以改變的fd1.v2.i++;//!false:fd1.v2 = new Value(3);//V_3與v2類似,是靜態和非靜態的區別,下面會說明fd1.V_3.i++;//!false:fd1.V_3 = new Value(10);}

通過例子,確實也證明上面所說,一個以final修飾的引用數據類型變量,無法再指向一個新的對象,因為它所存儲的地址值已經無法被更改,但是并不影響它指向的實際對象。就拿一個比較典型的引用類型來舉例,我們知道數組就是一種典型的引用類型,數組的引用變量存儲的是數組再堆中的地址,堆中存放的就是數組每個索引的數值。

/*引用變量之數組*/private final int[] a = {1,2,3,4,5,6};

引用變量a被指定為final,所以它里面的地址值不能再改,也就無法再讓它指向一個新的數組。

//!false:fd1.a = new int[]{2,3,4,5,6,7};for (int i = 0; i < fd1.a.length; i++) {  fd1.a[i]++;

但是,它指向的數組里的每個元素卻可以改動,因為數組中的元素并沒有任何的限定。

final與static final

private final int i4 = rand.nextInt(20);static final int INT_5 = rand.nextInt(20);System.out.println(fd1);//fd1: i4 = 15,INT_518FinalData fd2 = new FinalData("fd2");System.out.println(fd2);//fd2: i4 = 13,INT_518FinalData fd3 = new FinalData("fd3");System.out.println(fd3);//fd3: i4 = 1,INT_5 = 18

上面示例分別創建了三個不同的對象,對其final 和final static 進行測試。

需要明確的是,兩者都以final修飾,都不能被改變。  三個對象的i4值,沒有用static修飾,不相同且不能改變。  而INT_5的值因為被static修飾,在類加載時已經被初始化,不隨對象改變而改變。

空白final域

即聲明為final卻沒有給定初始值的域。

private final String id;//空白final

如果只有上面的這句,編譯器會報錯,因為它沒有初始化。

Variable 'id' might not have been initialized

所以,若定義了空白final域,一定記得在構造器中給它賦值!(必須在域的定義處或者每個構造器中以表達式對final進行賦值,因為系統不會為final域默認初始化)

//在構造器中為空白final域賦初值public FinalData(){  id = "空白final默認id";}public FinalData(String id){  this.id = id;}

不要試圖在初始化之前訪問域,不然會報錯。

final讓域可以根據對象的不同而不同,增加靈活性的同時,又保留不被改變的特性。

final修飾的參數

基本數據類型的參數

類似地,就是傳入的參數不讓改,只讓讀,這一點很好理解。

public int finalParamTest(final int i){  //!false:i++;  //不讓改,只讓讀  return i+1;}

但是,我又新增了許多測試,分別定義四種不同的參數傳入該方法,發現傳入param0和param1編譯會報錯。(非常疑惑,這部分書上沒提,查了許多資料也沒有理解清楚,希望大牛可以評論區指點迷津)

/*檢測傳入參數*/int param0 = 5;final int param1 = 10;static final int PARAM_2 = 15;static int param3 = 20;//!false:System.out.println(fd1.finalParamTest(param0));//!false:System.out.println(fd1.finalParamTest(param1));//non-static field'param1' cannot be referenced from a static contextSystem.out.println(fd1.finalParamTest(PARAM_2));System.out.println(fd1.finalParamTest(param3));/*為什么形參列表里的參數用final修飾,但是用final修飾的param1無法傳進去,一定要static修飾?*/

引用數據類型的參數

public void finalReferenceTest(final FinalData fd){  //!false:fd = new FinalData();  //不能再指向新的對象,存儲地址不準變  fd.param0++;}

還是類似,不可以讓這個引用類型的參數再指向新的對象,但是可以改變其實際指向對象的值。

最后的最后,下面的代碼是根據《Thinking in Java》中的示例,結合自己的思想,將各個板塊融合而成的超級無敵測試代碼,沖沖沖!

package com.my.pac16;import java.util.Arrays;import java.util.Random;/** * @auther Summerday */class Value{  int i;//package access  public Value(int i){    this.i =i;  }}/*final域在使用前必須被初始化:定義時,構造器中*/public class FinalData {  /*檢測傳入參數*/  int param0 = 5;  final int param1 = 10;  static final int PARAM_2 = 15;  static int param3 = 20;  private static Random rand = new Random(47);  private final String id;//空白final  public FinalData(){    id = "空白final默認id";  }  public FinalData(String id){    this.id = id;  }  //帶有編譯時數值的final基本類型  private final int valueOne = 9;  private static final int VALUE_TWO = 99;  //典型常量的定義方式  public static final int VALUE_THREE = 39;  //在編譯是不能知道其值  private final int i4 = rand.nextInt(20);  static final int INT_5 = rand.nextInt(20);  private Value v1 = new Value(1);  private final Value v2 = new Value(22);  private static final Value V_3 = new Value(333);  private final int[] a = {1,2,3,4,5,6};  @Override  public String toString(){    return id+": "+"i4 = "+i4+",INT_5 = "+INT_5;  }  public int finalParamTest(final int i){    //!false:i++;    //不讓改,只讓讀    return i+1;  }  public void finalReferenceTest(final FinalData fd){    //!false:fd = new FinalData();    //不能再指向新的對象,存儲地址不準變    fd.param0++;  }  public static void main(String[] args) {    FinalData fd1 = new FinalData("fd1");    /*基本類型變量*/    //!false:fd1.valueOne++;    //!false:fd1.VALUE_TWO++;    //!false:fd1.VALUE_THREE++;    /*引用變量*/    fd1.v1 = new Value(10);    fd1.v2.i++    //!false:fd1.v2 = new Value(3);    System.out.println("fd1.v2.i = [" + fd1.v2.i + "]");    //!false:fd1.V_3 = new Value(10);    fd1.V_3.i++;    System.out.println("fd1.V_3.i = [" + fd1.V_3.i + "]");    /*引用變量之數組*/    System.out.println("before:fd1.a[] = " + Arrays.toString(fd1.a));    /*數組引用變量a是final修飾,    但是不代表它指向的數據值是final,    而是a存儲的地址值不能改變     */    //!false:fd1.a = new int[]{2,3,4,5,6,7};    for (int i = 0; i < fd1.a.length; i++) {      fd1.a[i]++;    }    System.out.println("after :fd1.a[] = " + Arrays.toString(fd1.a));    /*final 與static final*/    //下面示例分別創建了三個不同的對象,對其final 和final static 進行測試    /*可以發現,三個對象的i4值是隨機生成且不能改變的,且不相同,    而INT_5的值不隨對象改變而改變,因為被static修飾,在類加載時已經被初始化*/    System.out.println(fd1);//fd1: i4 = 15,INT_518    FinalData fd2 = new FinalData("fd2");    System.out.println(fd2);//fd2: i4 = 13,INT_518    FinalData fd3 = new FinalData("fd3");    System.out.println(fd3);//fd3: i4 = 1,INT_5 = 18    //!false:System.out.println(fd1.finalParamTest(param0));    //!false:System.out.println(fd1.finalParamTest(param1));    //non-static field'param1' cannot be referenced from a static context    System.out.println(fd1.finalParamTest(PARAM_2));    System.out.println(fd1.finalParamTest(param3));    /*為什么形參列表里的參數用final修飾,但是用final修飾的param1無法傳進去,    一定要static修飾?*/    System.out.println("fd1.param0 = "+fd1.param0);    fd1.finalReferenceTest(fd1);    System.out.println("fd1.param0 = "+fd1.param0);  }}

感謝各位的閱讀,以上就是“Java用final修飾數據的過程”的內容了,經過本文的學習后,相信大家對Java用final修飾數據的過程這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广元市| 连城县| 华宁县| 紫金县| 武邑县| 化德县| 卓资县| 高阳县| 张家川| 山阳县| 蒙自县| 万源市| 临汾市| 德保县| 碌曲县| 阳谷县| 东方市| 通化市| 南部县| 陇川县| 赫章县| 银川市| 平塘县| 盐津县| 吉首市| 兴仁县| 枣阳市| 项城市| 荥阳市| 库伦旗| 拜泉县| 石泉县| 休宁县| 扶余县| 普陀区| 襄垣县| 镇安县| 哈尔滨市| 车致| 梁山县| 炎陵县|