欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

final關(guān)鍵字的小細(xì)節(jié)有哪些

本篇內(nèi)容主要講解“final關(guān)鍵字的小細(xì)節(jié)有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“final關(guān)鍵字的小細(xì)節(jié)有哪些”吧!

十多年的尋烏網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整尋烏建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“尋烏網(wǎng)站設(shè)計(jì)”,“尋烏網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

正文

final關(guān)鍵字是一個(gè)常用的關(guān)鍵字,可以修飾變量、方法、類,用來表示它修飾的類、方法和變量不可改變,下面就聊一下使用 final 關(guān)鍵字的一些小細(xì)節(jié)。

細(xì)節(jié)一、final 修飾類成員變量和實(shí)例成員變量的賦值時(shí)機(jī)

對(duì)于類變量:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  聲明變量的時(shí)候直接賦初始值

  3.  在靜態(tài)代碼塊中給類變量賦初始值

如下代碼所示:

public class FinalTest {      //a變量直接賦值      private final static  int a = 1;      private final static  int b;      //b變量通過靜態(tài)代碼塊賦值      static {          b=2;      }  }

對(duì)于實(shí)例變量:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  在聲明變量的時(shí)候直接賦值

  3.  在非靜態(tài)代碼塊中賦值

  4.  在構(gòu)造器中賦初始化值

如下代碼所示:

public class FinalTest {      //c變量在在聲明時(shí)直接賦值      private final  int c =1;      private final  int d;      private final  int e;      //d變量在非靜態(tài)代碼塊中賦值      {          d=2;      }      //e變量在構(gòu)造器中賦值      FinalTest(){          e=3;      }  }

細(xì)節(jié)二、當(dāng) final 修飾的成員變量未對(duì)它進(jìn)行初始化時(shí),會(huì)出現(xiàn)錯(cuò)誤嗎?

答:會(huì)出現(xiàn)錯(cuò)誤。因?yàn)?java 語法規(guī)定,final 修飾的成員變量必須由程序員顯示的初始化,系統(tǒng)不會(huì)對(duì)變量進(jìn)行隱式的初始化。

如下圖所示,未初始化變量就會(huì)出現(xiàn)編譯錯(cuò)誤:

final關(guān)鍵字的小細(xì)節(jié)有哪些

細(xì)節(jié)三、final 修飾基本類型變量和引用類型變量的區(qū)別

如果 fianl 修飾的是一個(gè)基本數(shù)據(jù)類型的數(shù)據(jù),一旦賦值后就不能再次更改。

那么 final 修飾的是引用數(shù)據(jù)類型呢?這個(gè)引用的變量能夠改變嗎?

看下面的代碼:

public class FinalTest {      //在聲明final實(shí)例成員變量時(shí)進(jìn)行賦值      private final static Student student = new Student(50, "Java");      public static void main(String[] args) {          //對(duì)final引用數(shù)據(jù)類型student進(jìn)行更改          student.age = 100;          System.out.println(student.toString());      }      static class Student {          private int age;          private String name;          public Student(int age, String name) {              this.age = age;              this.name = name;          }          @Override          public String toString() {              return "Student{" +                      "age=" + age +                      ", name='" + name + '\'' +                      '}';          }      }  }  //下面是打印結(jié)果  Student{age=100, name='Java'}

從打印結(jié)果可以看到:引用數(shù)據(jù)類型變量 student 的 age 屬性修改成 100,是可以修改成功的。

結(jié)論:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  當(dāng) final 修飾基本數(shù)據(jù)類型變量時(shí),不能對(duì)基本數(shù)據(jù)類型變量重新賦值,因此基本數(shù)據(jù)類型變量不能被改變。

  3.  對(duì)于引用類型變量而言,它僅僅保存的是一個(gè)引用,final 只保證這個(gè)引用類型變量所引用的地址不會(huì)發(fā)生改變,即一直引用這個(gè)對(duì)象,但這個(gè)對(duì)象里面的屬性是可以改變的。

細(xì)節(jié)四、final 修飾局部變量的場(chǎng)景

fianl 局部變量由程序員進(jìn)行顯示的初始化,如果 final 局部變量進(jìn)行初始化之后就不能再次進(jìn)行更改。

如果 final 變量未進(jìn)行初始化,可以進(jìn)行賦值,并且只能進(jìn)行一次賦值,一旦賦值之后再次賦值就會(huì)出錯(cuò)。

下面的代碼演示 final 修飾局部變量的情況:

final關(guān)鍵字的小細(xì)節(jié)有哪些

細(xì)節(jié)五、final 修飾方法會(huì)對(duì)重載有影響嗎?重寫呢?

對(duì)于重載:final 修飾方法后是可以重載的

如下代碼:

public class FinalTest {      public final void test(){      }      //重載方法不會(huì)出現(xiàn)問題      public final void test(String test){      }  }

對(duì)于重寫:當(dāng)父類的方法被 final 修飾的時(shí)候,子類不能重寫父類的該方法

final關(guān)鍵字的小細(xì)節(jié)有哪些

如上代碼所示,可以看到會(huì)出現(xiàn) cannot override ,overridden method is final 的編譯錯(cuò)誤提示

細(xì)節(jié)六、final 修飾類的場(chǎng)景

當(dāng)用final修飾一個(gè)類時(shí),表明這個(gè)類不能被繼承。也就是說,如果一個(gè)類你永遠(yuǎn)不會(huì)讓他被繼承,就可以用 final 進(jìn)行修飾。

final 類中的成員變量可以根據(jù)需要設(shè)為 final,但是要注意 final 類中的所有成員方法都會(huì)被隱式地指定為 final 方法。

細(xì)節(jié)七、寫 final 域的重排序規(guī)則,你知道嗎?

這個(gè)規(guī)則是指禁止對(duì) final 域的寫重排序到構(gòu)造函數(shù)之外,這個(gè)規(guī)則的實(shí)現(xiàn)主要包含了兩個(gè)方面:

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2.  JMM 禁止編譯器把 final 域的寫重排序 到 構(gòu)造函數(shù) 之外

  3.  編譯器會(huì)在 final 域?qū)懼螅瑯?gòu)造函數(shù) return 之前,插入一個(gè) StoreStore 屏障。這個(gè)屏障可以禁止處理器把 final 域的寫重排序到構(gòu)造函數(shù)之外

給舉個(gè)例子,要不太抽象了,先看一段代碼

public class FinalTest{      private int a;  //普通域      private final int b; //final域      private static FinalTest finalTest;      public FinalTest() {          a = 1; // 1. 寫普通域          b = 2; // 2. 寫final域      }      public static void writer() {          finalTest = new FinalTest();      }      public static void reader() {          FinalTest demo = finalTest; // 3.讀對(duì)象引用          int a = demo.a;    //4.讀普通域          int b = demo.b;    //5.讀final域      }  }

假設(shè)線程 A 在執(zhí)行 writer()方法,線程 B 執(zhí)行 reader()方法。

由于變量 a 和變量 b 之間沒有依賴性,所以就有可能會(huì)出現(xiàn)下圖所示的重排序

final關(guān)鍵字的小細(xì)節(jié)有哪些

由于普通變量 a 可能會(huì)被重排序到構(gòu)造函數(shù)之外,所以線程 B 就有可能讀到的是普通變量 a 初始化之前的值(零值),這樣就可能出現(xiàn)錯(cuò)誤。

而 final 域變量 b,根據(jù)重排序規(guī)則,會(huì)禁止 final 修飾的變量 b 重排序到構(gòu)造函數(shù)之外,從而 b 能夠正確賦值,線程 B 就能夠讀到 final 域變量 b初始化后的值。

結(jié)論:寫 final 域的重排序規(guī)則可以確保在對(duì)象引用為任意線程可見之前,對(duì)象的 final 域已經(jīng)被正確初始化過了,而普通域就不具有這個(gè)保障。

細(xì)節(jié)八:讀 final 域的重排序規(guī)則,你知道嗎?

這個(gè)規(guī)則是指在一個(gè)線程中,初次讀對(duì)象引用和初次讀該對(duì)象包含的 final 域,JMM 會(huì)禁止這兩個(gè)操作的重排序。

還是上面那段代碼

public class FinalTest{      private int a;  //普通域      private final int b; //final域      private static FinalTest finalTest;      public FinalTest() {          a = 1; // 1. 寫普通域          b = 2; // 2. 寫final域      }      public static void writer() {          finalTest = new FinalTest();      }      public static void reader() {          FinalTest demo = finalTest; // 3.讀對(duì)象引用          int a = demo.a;    //4.讀普通域          int b = demo.b;    //5.讀final域      }  }

假設(shè)線程 A 在執(zhí)行 writer()方法,線程 B 執(zhí)行 reader()方法。

線程 B 可能就會(huì)出現(xiàn)下圖所示的重排序

final關(guān)鍵字的小細(xì)節(jié)有哪些

可以看到,由于讀對(duì)象的普通域被重排序到了讀對(duì)象引用的前面,就會(huì)出現(xiàn)線程 B 還未讀到對(duì)象引用就在讀取該對(duì)象的普通域變量,這顯然是錯(cuò)誤的操作。而 final 域的讀操作就“限定”了在讀 final 域變量前已經(jīng)讀到了該對(duì)象的引用,從而就可以避免這種情況。

結(jié)論:讀 final 域的重排序規(guī)則可以確保在讀一個(gè)對(duì)象的 final 域之前,一定會(huì)先讀包含這個(gè) final 域的對(duì)象的引用。

到此,相信大家對(duì)“final關(guān)鍵字的小細(xì)節(jié)有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章標(biāo)題:final關(guān)鍵字的小細(xì)節(jié)有哪些
當(dāng)前鏈接:http://chinadenli.net/article26/jpshcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷推廣Google軟件開發(fā)App開發(fā)網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名