Java基础(012):静态变量和实例变量以及局部变量的区别
注:有需要的可以進一步關注Java中關于 [4]8.2. Class Members 相關說明。
在Java中,變量([1]Declaring Member Variables 和 [2]Variables)包括以下幾種:
成員變量,包括靜態變量和實例變量,是在類中定義的,通過 static 關鍵字區分,也稱為屬性 field局部變量 local variables:方法中定義的臨時變量
靜態變量/類變量, class variables (or static variables),屬于類,類加載時會同時進行加載,只有唯一的一份。
實例變量 instance variables:屬于實例,實例化時會都會初始化一次,是實例獨有的。
局部變量 local variables:方法中定義的臨時變量
方法參數:方法定義中的參數列表中涉及到的變量
以下是一些相關的總結:
| 比較點 | 靜態變量/類變量 | 實例變量 | 局部變量 |
|---|---|---|---|
| 語法定義 |
在類中聲明且使用 也稱為類變量(class variables),還可以用訪問權限修飾符和final修飾 |
和類變量聲明類似,區別在于沒有static修飾 |
|
| 定義位置 | 在類中,但是在方法、構造器、語句塊之外,聲明上是獨立存在的 | 一樣 | 方法內部、構造器或者語句塊中(靜態代碼塊和非靜態代碼塊) |
| 存放位置 | 方法區 | 堆 (不包括棧上分配、標量替換等) | 棧 + 堆(對象) |
| 加載時機 |
類加載時進行唯一的一次內存分配,除非類加載器重新加載, 否則不會再分配內存,在類加載器層面只有這一個共享的 |
實例化的時候分配內存 | 語句執行時(聲明+初始化/賦值)進行分配 |
| 運行時/生命周期 |
與類綁定,隨著類加載而初始化,隨著類卸載而回收。靜態變量是類層面的, 只要類加載器加載了對應的類,靜態變量就已經分配內存了,也即是說,在 加載類的過程中完成靜態變量的內存分配,而且只有一次。靜態變量不用創 建任何實例對象可以被直接使用,在類加載器層面是唯一的,所有實例共享, 一般是直接通過類名來進行引用。 |
實例變量隨著對象的實例化創建而分配,隨著對象的消失而回收。實例變量是類實例層面的, 是具體實例的一個屬性,只有類實例化分配內存后才會存在,才可以通過實例對象的引用來 進行訪問使用。每次實例化都會新分配一次內存,實例變量依賴于對應的具體實例,而且在 每個實例對象中是唯一的,不共享。 |
一般隨著方法調用結束而銷毀,除非作為結果返回或者中間作為外層變量的屬性等,生命周期會擴大 |
| 作用域 | 類加載時就存在,類卸載時回收 | 實例化時存在,隨著實例被回收而消失 | 對應的語句塊內部,一般是在最近的{}內部 |
| 調用方式 | 一般通過類名直接引用,如ClassName.StaticVariableName |
通過實例對象進行引用 | 在作用域之內直接引用,一般建議哪里使用就在哪里聲明 |
| 可見性 | public/(default)/protected/private (訪問權限修飾符) | 一樣 | / |
final修飾 |
一般都當作是全局常量,而且建議全大寫的命名方式 |
只初始化一次,后續不能再修改(對象不能重新引用,原始數據類型不能修改值),當作是引 用值(內部屬性可能可以修改)或者原始數據類型值不可變 |
同樣只能初始化一次 |
| 初始化/默認值 | 數值型變量默認值為 0,布爾型默認值為false,引用類型默認值為null |
一樣 | 無默認值,需要強制初始化 |
| 共享和并發問題 | 靜態變量是共享的,多線程寫會存在并發問題,建議盡量使用不可變對象或者常量 | 實例獨有,有可能存在并發修改問題 | |
| 使用建議 | 靜態常量、不可變對象 | 哪里用到就在哪里聲明 |
參考:
[1]Declaring Member Variableshttps://docs.oracle.com/javase/tutorial/java/javaOO/variables.html
[2]Variableshttps://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html
[3]Understanding Class Membershttps://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
[4]8.2. Class Membershttps://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html
[5]CLASS VARIABLES, INSTANCE VARIABLES AND LOCAL VARIABLES IN JAVAhttps://www.javajee.com/class-variables-instance-variables-and-local-variables-in-java
總結
以上是生活随笔為你收集整理的Java基础(012):静态变量和实例变量以及局部变量的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins job config.x
- 下一篇: 特斯拉 2023.12.9 重磅更新:中