final關鍵字要掌握的知識點

2020-12-23 Java章魚小弟

Java裡final關鍵字,老生常談的幾個點很多人都應該知道,你不遵循下面的定義,編譯器都會報錯不給通過。

fianl修飾的類是不能被繼承的final修飾的方法是不能被子類重寫的final修飾的變量是不可變的

final修飾的引用類型變量

關於第3條,這個變量不可變,假如變量是引用型變量,指的是這個變量在內存中的地址不可變,並不是變量本身元素不可變,來看代碼示例

final修飾基本類型變量不可變

final修飾的變量要麼在聲明時就要初始化,要麼在構建方法裡初始化,不然編譯器也會報錯基本類型i,我在read方法裡改變它的值編譯器會報錯,因為final修飾的不可變引用類型array,我在構造方法裡指定它裡面元素是1,然後在read方法裡更改元素是2

final修飾應用類型內存地址不可變

看到沒array這個數組的元素是可以改的。

final域的重排序規則

對於final域,編譯器和處理器要遵守兩個重排序規則。

在構造函數內對一個final域的寫入,與隨後把這個被構造對象的引用賦值給一個引用變量,這兩個操作不能重排序初次讀一個包含final域的對象的引用,與隨後初次讀這個final,這兩個操作不能重排序

final能確保正確初始化

final域這兩條指令重排序能確保在多線程的環境裡,i和array都能正確被初始化,其他線程在讀到obj這個對象的final域(比如array)時,一定先讀包含final域對象的引用,而不會讀成null。

final域指令重排序實現方式與總結

在final域寫之後,構造方法return之前插入StoreStore內存屏障,在讀final域之前插入LoadLoad內存屏障,這樣可以確保final域的讀寫不會被重排序到對象構造方法之外,確保final域能被正確初始化。對內存屏障不清楚的同學可以看下這篇深入分析volatile是如何實現可見性和有序性的

面試題:String 為什麼是final的

先看下String的定義

String的定義

它的內部有個本地intern()方法

本地intern()方法

對於這個面試題每個人都有自己的理解,我這邊給出自己的幾點參考。

Java把String設計為常量,放在字符串常量池裡,被final修飾後不可變,多個線程只有讀沒有寫操作,就是線程安全的。它裡面有hash屬性,因為字符串是不可變的,所以在它創建的時候hashcode就被緩存了,不需要重新計算。這就使得字符串很適合作為Map中的鍵字符串池的實現可以在運行時節約很多heap空間,因為不同的字符串變量都指向池中的同一個字符串。但如果字符串是可變的,那麼String intern()將不能實現(String intern()是指對不同的字符串僅僅只保存一個,即不會保存多個相同的字符串。),因為這樣的話,如果變量改變了它的值,那麼其它指向這個值的變量的值也會一起改變。

相關焦點

  • static和final,今天的文章要說的就是訪問控制中的這兩個關鍵字
    下面這篇文章我們介紹訪問控制中的第二部分static和final關鍵字。static關鍵字static修飾成員變量用static修飾的成員變量不屬於對象的數據結構,static變量是屬於類的變量,通常可以通過類名來引用static成員。
  • final 關鍵字的使用
    相信很多人還不知道final關鍵字的使用吧,那就和我一起看看吧1,final關鍵字修飾類Java中的關鍵字被修飾後不能被繼承package chap;final class Animal{}class Dog extends
  • java關鍵字——final
    1.final修飾類final類表示最終的類,言外之意就是不能有其他類繼承這個final類,所以在做開發時如果自己寫的類不能有繼承,那麼就用final修飾;注意點:final類中的變量可以根據需要設為final,但是final類中的所有方法都會被隱式地指定為final方法2.final變量final變量表示最終的變量,言外之意就是這個變量為常量
  • Java之final關鍵字詳解
    前言針對Java語言中的final關鍵字,想必都不陌生了。本來主要是來對final做關鍵字做一個總結。final關鍵字用法修飾類當用final去修飾一個類的時候,表示這個類不能被繼承。注意:a.被final修飾的類,final類中的成員變量可以根據自己的實際需要設計為fianl。b. final類中的成員方法都會被隱式的指定為final方法。說明:在自己設計一個類的時候,要想好這個類將來是否會被繼承,如果可以被繼承,則該類不能使用fianl修飾,在這裡呢,一般來說工具類我們往往都會設計成為一個fianl類。在JDK中,被設計為final類的有String、System等。
  • Java之final關鍵字的簡單介紹下
    各位小夥伴大家好,在之前的文章中,小編有介紹過,final關鍵字修飾局部變量Java之final關鍵字的簡單介紹中,支持小編要介紹的是final關鍵字修飾成員變量Java之成員變量和局部變量的區別。final關鍵字修飾成員變量:對於成員變量來說,如果使用final關鍵字,那麼這個變量是不可變。1.由於成員變量具有默認值,所以用了final之後必須手動賦值,不會給默認值了。2.對於final修飾的成員變量,要麼使用直接賦值,要麼通過構造方法Java之構造方法與this關鍵字的簡單介紹賦值,二者選其一3.必須保證類當中所有重載的構造方法,都最終會對final的成員變量進行賦值。
  • Java之final關鍵字的簡單介紹中
    各位小夥伴,大家好,在之前的文章小編有介紹過關鍵字fina修飾類和成員方法Java之final關鍵字的簡單介紹上。這次,小編要介紹的是關鍵字final修飾局部變量。finalint num2=100;System.out.println(num2);//int num2=300;報錯//正確寫法,只要保證有唯一一次複製即可。int num3;num3=300;對於基本數據類型來說,不可變說的是變量中的數據不可改變。對於引用類型來說,不可變的變量是地址值不可以改變。
  • Java初學者系列:一文讀懂final關鍵字
    #程式設計師之前文章中我們學習了一些java中的關鍵字,通過這些關鍵字可以幫助我們定義類、實例、方法的可見性,今天我們一起來學習java中的final關鍵字,這個關鍵字同樣可以用來修飾類、實例、方法、參數等。
  • 一文解析Java常用關鍵字
    4.2.2.2 final變量構造函數中初始化(空白final) 因為被final修飾的變量一定要在使用前被初始化,所以如果沒在定義操作,一定在構造函數中初始化,這種情況稱為空白final。
  • 「原創」Java並發編程系列06|你不知道的final
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫final在Java中是一個保留的關鍵字,可以修飾變量、方法和類。那麼fianl在並發編程中有什麼作用呢?本文就在對final常見應用總結基礎上,講解final並發編程中的應用。
  • 扯一下final、權限、內部類、引用類型
    final關鍵字學習了繼承後,我們知道,子類可以在父類的基礎上改寫父類內容,比如,方法重寫。那麼我們能不能隨意地繼承API中提供的類,改寫其內容呢?顯然這是不合適的。為了避免這種隨意改寫的情況,Java提供了 final 關鍵字,用於修飾不可改變內容。
  • [博客更新]Java 中 final 關鍵詞的使用
    上一篇文章我們講了 java 中 static 關鍵字的使用,這裡再將一下 final 關鍵字的使用。final 在 java 中可以看做一個「終結者」,它可以定義類、定義方法和定義變量。哎呀,好像沒別的可說了,就這樣吧,這可能是我寫過的字數最少的一篇文章了 算了,最後加一個示例程序吧,當然是錯誤的程序,包含了以上三種使用方法的錯誤使用報錯信息:package com.example.finalDemo;/** * User: sunriseydy * 2018-4-25 22:04 */finalclassPerson{String name
  • 2021 必須掌握的 21個Java 核心技術
    這個知識點是最最基本的java開發者需要掌握的,第一個肯定是教你如何在命令行中執行java程序,但是很多人一旦把java學完了,IDE用上了,就把這個都忘了。 為什麼強調要知道這個呢,知道了java最純粹的啟動方式之後,你才能在啟動出問題的時候,去分析當時啟動的目錄多少,執行命名如何,參數如何,是否有缺失等。
  • 留學人final week逃亡實錄|留學申請
    門派絕學:持之以恆的自律精神每個final人身邊都有這種類型的選手,他們從final周的一個月前就開始列出複習計劃,從每天的複習章節,複習時間,甚至練習多少道教授給出的sample question都安排得明明白白,讓每一個知識點都無處可逃。
  • Java面向對象之final、abstract抽象、和變量生命周期
    final class代碼顯示錯誤,無法從SuperClass繼承,編譯器提示刪除final關鍵字;刪除final關鍵字後,代碼正確無誤。java裡部分final修飾的類使用final關鍵字修飾方法如果用final關鍵字修飾方法呢?
  • 給Java新手的一些建議——Java知識點歸納(Java基礎部分)
    這個知識點是最最基本的java開發者需要掌握的,初學java,第一個肯定是教你如何在命令行中執行java程序,但是很多人一旦把java學完了,IDE用上了,就把這個都忘了。為什麼強調要知道這個呢,知道了java最純粹的啟動方式之後,你才能在啟動出問題的時候,去分析當時啟動的目錄多少,執行命名如何,參數如何,是否有缺失等。
  • 深入理解final
    final◆ ◆ ◆ ◆java的關鍵字final的含義根據上下文會有一些細微的區別,通常是指「無法改變」。不想改變的原因一般有兩種:設計、效率。一般用final來修飾數據、方法、類。(以上說明的final數據都是在同一個類中成立。)java中允許生成空白final,即聲明為final但是又沒給定初值,這種時候一般由不同的構造函數,在構造函數中賦初值。
  • java中static, final, 內部類的具體運用
    public class Person {private String name;private int age;//靜態代碼塊static{System.out.println("靜態代碼塊執行了");}}final關鍵字:關鍵字final,final的意思為最終
  • 高中化學:必背瑣碎知識點!高一現在收藏,全部掌握,三年不丟分
    化學和生物都包括大量瑣碎的知識點。所以學好化學和生物,首先是記清課本上的知識,再根據題目解題。化學、生物很容易以現代科學知識背景出題,這要求我們有一定的遷移能力。另外,化學要特別注意審題,注意答題的規範性,如看清問的是「電子式」、「分子式」還是「結構式」,不要答非所問。
  • 銀行職業資格考試中,如何合理安排時間,掌握考試節奏?
    如何才能在考試中合理安排時間,掌握考試的節奏呢?有以下幾個要點大家可以參考一下!(1)基礎知識要紮實紮實的基礎知識是考試致勝的關鍵,只有自己牢固地掌握了知識點才能快速準確的做對題目。紮實的基礎知識可以讓自己讀題即解題,不僅做題的速度快而且正確率也高,輕鬆的將考試節奏掌握在自己手中。
  • 初三化學:知識點總結歸納(完整版),學生應該要掌握的內容!
    初三化學是啟蒙化學,基礎知識點多而雜,隨著知識的積累,有些學生會因學習方法不當而導致化學成績下滑甚至產生厭學情緒。所以,學習初中化學不僅要學好,還要對化學感興趣,這樣才能繼續接下來的學習。作為初三開設的學科,同時又是一門中考中考核的主科,化學的學習是很關鍵的,如何學好化學也是每一位即將面臨化學學習的同學所關心的。