Java關鍵字final、static使用總結

2021-02-13 51CTO技術棧

一 final

根據程序上下文環境,Java關鍵字final有「這是無法改變的」或者「終態的」含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而需要阻止改變:設計或效率。

final類不能被繼承,沒有子類,final類中的方法默認是final的。

final方法不能被子類的方法覆蓋,但可以被繼承。

final成員變量表示常量,只能被賦值一次,賦值後值不再改變。

final不能用於修飾構造方法。

注意:父類的private成員方法是不能被子類方法覆蓋的,因此private類型的方法默認是final類型的。

1 final類

final類不能被繼承,因此final類的成員方法沒有機會被覆蓋,默認都是final的。在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會載被擴展,那麼就設計為final類。

2 final方法

如果一個類不允許其子類覆蓋某個方法,則可以把這個方法聲明為final方法。

使用final方法的原因有二:

第一、把方法鎖定,防止任何繼承類修改它的意義和實現。

第二、高效。編譯器在遇到調用final方法時候會轉入內嵌機制,大大提高執行效率。

例如:

3 final變量(常量)

用final修飾的成員變量表示常量,值一旦給定就無法改變!

final修飾的變量有三種:靜態變量、實例變量和局部變量,分別表示三種類型的常量。

從下面的例子中可以看出,一旦給final變量初值後,值就不能再改變了。

另外,final變量定義的時候,可以先聲明,而不給初值,這中變量也稱為final空白,無論什麼情況,編譯器都確保空白final在使用之前必須被初始化。但是,final空白在final關鍵字final的使用上提供了更大的靈活性,為此,一個類中的final數據成員就可以實現依對象而有所不同,卻有保持其恆定不變的特徵。

4 final參數

當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。

二、static

static表示「全局」或者「靜態」的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊,但是Java語言中沒有全局變量的概念。

被static修飾的成員變量和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。只要這個類被加載,Java虛擬機就能根據類名在運行時數據區的方法區內定找到他們。因此,static對象可以在它的任何對象創建之前訪問,無需引用任何對象。

用public修飾的static成員變量和成員方法本質是全局變量和全局方法,當聲明它類的對象市,不生成static變量的副本,而是類的所有實例共享同一個static變量。

static變量前可以有private修飾,表示這個變量可以在類的靜態代碼塊中,或者類的其他靜態成員方法中使用(當然也可以在非靜態成員方法中使用--廢話),但是不能在其他類中通過類名來直接引用,這一點很重要。實際上你需要搞明白,private是訪問權限限定,static表示不要實例化就可以使用,這樣就容易理解多了。static前面加上其它訪問權限關鍵字的效果也以此類推。

static修飾的成員變量和成員方法習慣上稱為靜態變量和靜態方法,可以直接通過類名來訪問,訪問語法為:

類名.靜態方法名(參數列表...)

類名.靜態變量名

用static修飾的代碼塊表示靜態代碼塊,當Java虛擬機(JVM)加載類時,就會執行該代碼塊(用處非常大,呵呵)。

1 static變量

按照是否靜態的對類成員變量進行分類可分兩種:一種是被static修飾的變量,叫靜態變量或類變量;另一種是沒有被static修飾的變量,叫實例變量。兩者的區別是:

對於靜態變量在內存中只有一個拷貝(節省內存),JVM只為靜態分配一次內存,在加載類的過程中完成靜態變量的內存分配,可用類名直接訪問(方便),當然也可以通過對象來訪問(但是這是不推薦的)。

對於實例變量,沒創建一個實例,就會為實例變量分配一次內存,實例變量可以在內存中有多個拷貝,互不影響(靈活)。

2 靜態方法

靜態方法可以直接通過類名調用,任何的實例也都可以調用,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。因為實例成員與特定的對象關聯!這個需要去理解,想明白其中的道理,不是記憶!!!

因為static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。

3 static代碼塊

static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個代碼塊只會被執行一次。

例如:

運行結果:

利用靜態代碼塊可以對一些static變量進行賦值,最後再看一眼這些例子,都一個static的main方法,這樣JVM在運行main方法的時候可以直接調用而不用創建實例。

4 static和final一塊用表示什麼

static final用來修飾成員變量和成員方法,可簡單理解為「全局常量」!

對於變量,表示一旦給值就不可修改,並且通過類名可以訪問。

對於方法,表示不可覆蓋,並且可以通過類名直接訪問。

特別要注意一個問題:


對於被static和final修飾過的實例常量,實例本身不能再改變了,但對於一些容器類型(比如,ArrayList、HashMap)的實例變量,不可以改變容器變量本身,但可以修改容器中存放的對象,這一點在編程中用到很多。

也許說了這麼多,反倒把你搞暈了,還是看個例子吧:

運行結果如下:

---值處理前

strStaticFinalVar=aaa

strStaticVar=null

strFinalVar=null

intStaticFinalVar=0

integerStaticFinalVar=8

alStaticFinalVar=[]

---值處理後

strStaticFinalVar=aaa

strStaticVar=哈哈哈哈

strFinalVar=null

intStaticFinalVar=0

integerStaticFinalVar=8

alStaticFinalVar=[aaa, bbb]

Process finished with exit code 0

看了上面這個例子,就清楚很多了,但必須明白:通過static final修飾的容器類型變量中所「裝」的對象是可改變的。這是和一般基本類型和類類型變量差別很大的地方。

相關焦點

  • 深入分析Java中的關鍵字static
    在平時開發當中,我們經常會遇見static關鍵字。這篇文章就把java中static關鍵字的使用方法的原理進行一個深入的分析。先給出這篇文章的大致脈絡:首先,描述了static關鍵字去修飾java類、方法、變量、代碼塊的方法然後,從底層分析static關鍵字,接下來,給出static的一些使用場景和案例最後,對static進行一個總結,包括和普通變量的區分。
  • 【編程基礎】深入理解Java中的final關鍵字
    Java中的final關鍵字非常重要,它可以應用於類、方法以及變量。這篇這篇文章中我將帶你看看什麼是final關鍵字?將變量,方法和類聲明為final代表了什麼?使用final的好處是什麼?最後也有一些使用final關鍵字的實例。final經常和static一起使用來聲明常量,你也會看到final是如何改善應用性能的。1、final關鍵字的含義?
  • java enum(枚舉)使用詳解 + 總結
    enum 的全稱為 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。下面是我在使用 enum 過程中的一些經驗和總結。enum 關鍵字,隱含了所創建的類型都是 java.lang.Enum 類的子類(java.lang.Enum 是一個抽象類)。
  • 每日一課 | Java Static關鍵字示例
    static關鍵字可確保在內存中僅創建一個相關方法,對象或變量的實例。當需要一個類級別的變量來管理某些屬性值時,以及需要一個類級別的方法來執行某些操作時,都可以使用它。下面每個內容中都會詳細討論static關鍵字的使用。1. STATIC關鍵字作為變量修飾符當將static關鍵字用於變量時,它指示每個類僅應實例化一個變量。
  • 每日一課 | Java Final關鍵字示例
    Java中的Final關鍵字是一個修飾符,用於限制用戶執行不需要的代碼或防止代碼或值被更改。可以在3個上下文中使用此關鍵字。
  • Java之static關鍵字修飾成員方法
    各位小夥伴們大家好,這次小編要講的是Java當中,關鍵字static修飾成員方法的一些作用。關於成員方法,小編在之前的文章中有過介紹,大家可以去看java之類的定義和對象的創建及使用。在成員方法中一旦使用關鍵字static修飾,那麼就變成了靜態方法,靜態方法不屬於對象,屬於類。
  • Java面向對象之final、abstract抽象、和變量生命周期
    class代碼顯示錯誤,無法從SuperClass繼承,編譯器提示刪除final關鍵字;刪除final關鍵字後,代碼正確無誤。java裡部分final修飾的類使用final關鍵字修飾方法>如果用final關鍵字修飾方法呢?
  • Java並發關鍵字-final
    即使能夠知道final具體的使用方法,final在多線程中存在的重排序問題很容易忽略,希望能夠一起做下探討。final的具體使用場景final能夠修飾變量,方法和類,也就是final使用範圍基本涵蓋了Java每個地方,下面就分別以鎖修飾的位置:變量,方法和類分別來說一說。變量在Java中變量,可以分為成員變量以及方法局部變量。
  • 一文解析Java常用關鍵字
    二、Java 51個關鍵字 記住1:兩個保留字:const和goto (保留字:現在沒用,以後用得上) 記住2:所有的關鍵字都是小寫,一旦有大寫的,一定不是關鍵字 三、關鍵字static static是java中的一個關鍵字
  • Java中的static關鍵字解析
    static關鍵字是很多朋友在編寫代碼和閱讀代碼時碰到的比較難以理解的一個關鍵字,也是各大公司的面試官喜歡在面試時問到的知識點之一。以下是本文的目錄大綱:static關鍵字的用途static關鍵字的誤區常見的筆試面試題
  • C++中的static關鍵字的總結
    最近在備C++的課程,所以把在備課過程中遇到的問題進行了總結和梳理,先把C++中的static關鍵字的用法做以下總結。C++的static有兩種用法:面向過程程序設計中的static和面向對象程序設計中的static。前者應用於普通變量和函數,不涉及類;後者主要說明static在類中的作用。
  • Java什麼情況要使用static修飾
    static修飾的方法為靜態方法,修飾的變量為靜態變量,那什麼情況要使用static修飾呢?
  • 一篇文章帶你弄懂Final關鍵字的相關知識
    2.final關鍵字修飾類、修飾方法、修飾變量的特點final關鍵字修飾類:不能被別的類繼承;final關鍵字修飾方法:方法也不能被覆蓋,也就是方法不能被繼承的子類重寫;final關鍵字修飾變量:成員變量、局部變量是常量,僅一次賦值。
  • 為什麼Java的main方法必須是public static void?
    Main 方法是 Java 程序的入口,記住,我們這裡不會討論 Servlet、MIDlet 和其他任何容器管理的 java 程序,在 java 核心編程中,JVM 會查找類中的 public static void main(String[]args),如果找不到該方法就拋出錯誤 NoSuchMethodError:main 程序終止。
  • 3分鐘講清Java面試中的Java常用關鍵字
    當 static 修飾類變量時,如果該變量是 public 的話,表示該變量任何類都可以直接訪問,而且無需初始化類,直接使用 類名.static 變量 這種形式訪問即可。所以在使用 static 修飾類變量時,如何保證線程安全是我們常常需要考慮的。當 static 修飾方法時,代表該方法和當前類是無關的,任意類都可以直接訪問(如果權限是 public 的話)。
  • Java中的static關鍵字和靜態變量、靜態方法
    作者: Java進階者 來源:Java進階學習交流一、static關鍵字使用static修飾的變量和方法分別稱為類變量(或稱靜態變量)和類方法(或稱靜態方法),沒有使用static修飾的變量和方法分別稱為實例變量和實例方法
  • 「原創」Java並發編程系列06|你不知道的final
    本文轉載自【微信公眾號:java進階架構師,ID:java_jiagoushi】經微信公眾號授權轉載,如需轉載與原文作者聯繫final在Java中是一個保留的關鍵字,可以修飾變量、方法和類。那麼fianl在並發編程中有什麼作用呢?本文就在對final常見應用總結基礎上,講解final並發編程中的應用。
  • JAVA零基礎學習總結及筆記
    3.2.2 關鍵字關鍵字是Java語言中已經被賦予特定意義的一些單詞,不可以把這些字作為標識符來使用。,雖然const和goto不是Java的關鍵字,但也不可以使用。在Java語言中聲明一個常量,除了要制定數據類型外,還需要通過final關鍵字進行限定。
  • JAVA中synchronized與static synchronized 的區別
    一個日本作者-結成浩的《java多線程設計模式》有這樣的一個列子: pulbic class Something(){     publicsynchronizedvoid isSyncA(){}     publicsynchronizedvoid isSyncB(){}     publicstaticsynchronizedvoid
  • 終於明白了Java為什麼要加final關鍵字了!
    但是當你使用超過一種語言進行開發的時候就會發現,雖然都是高級語言,但是它們之間很多特性都是不太相同的。 # 現象描述 在 Java 8 之前,匿名內部類在使用外部成員的時候,會報錯並提示 「Cannot refer to a non-final variable arg inside an inner class defined in a different method」: