Java之實例變量和類變量

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/Julin1214/article/details/51485001
    

            Java程序的變量大體分爲成員變量和局部變量。
局部變量可以分爲三類:
            1 形參:在方法簽名中定義的局部變量,由方法調用者負責爲其賦值,隨方法的結束而消亡。
               (方法簽名由方法名稱和一個參數列表(方法的參數的順序和類型)組成
            2 方法內局部變量:在方法內定義的局部變量,必須在方法內對其進行顯式初始化。這種類型的局部變量從初始化完成後開始生效,隨方法的結束而消亡。
            3 代碼塊內的局部變量:在代碼塊內定義的局部變量,必須在代碼塊內對其進行顯式初始化。這種類型的局部變量從初始化完成後開始生效,隨代碼塊的結束而消亡。
        局部變量的作用時間很短暫,都被存儲在棧內存中。
        類體內的變量被稱爲成員變量,定義該成員變量沒有使用static的話,該成員變量被稱爲非靜態變量或實例變量;如果使用了static修飾的話,該成員變量又可被稱爲靜態變量或類變量。
    (static只能修飾在類裏定義的成員部分,包括成員變量、方法、內部類、初始化塊、內部枚舉類。如果沒有使用static修飾這些類裏的成員,這裏成員屬於該類的實例。如果使用了static修飾,這些成員就屬於類本身。static只能修飾類裏的成員,不能修飾外部類,不能修飾局部變量,局部內部類)
類變量初始化時機總是處於實例變量的初始化時機之前。
實例變量總是可以引用類變量。
一 實例變量和類變量的屬性
使用static修飾的成員變量是類變量,屬於該類本身;
沒有使用static修飾的成員變量是實例變量,屬於該類的實例。
由於同一個JVM內每個類只對應一個Class對象,因此同一個JVM內的一個類的類變量只需一塊內存空間。
對於實例變量而言,該類每創建一次實例,就需要爲實例變量分配一塊內存空間。
(每個類初始化完成後,系統都會爲該類創建一個對應的Class實例,程序可以通過反射來獲取某個類所對應的Class實例)
二實例變量的初始化時機
對於實例變量而言,它屬於Java對象本身,每次程序創建Java對象時都需要爲實例變量分配內存空間,並執行初始化。
從程序運行角度來看,每次創建Java對象都會爲實例變量分配內存空間,並對實例變量執行初始化。
從語法角度來看,程序可以在3個地方對實例變量執行初始化:
1 定義實例變量時指定初始值
2 非靜態初始化塊中對實例變量指定初始值
3 構造器中對實例變量指定初始值
其中第1、2種方式(定義時指定的初始值和非靜態初始化塊中指定的初始值)比第3種方式(構造器中指定的初始值)更早執行。
1、2種方式的執行順序與她們在源程序中的排列順序相同。
定義實例變量時指定的初始值、初始化塊中爲實例變量指定的初始值、構造器中爲實例變量指定的初始值,三者的作用完全類似,都用於對實例變量指定初始值。
經過編譯器處理之後,它們對應的賦值語句都被合併到構造器中。在合併過程中,定義變量語句轉換得到的賦值語句、初始化塊裏的語句轉換得到的賦值語句,總是位於構造器的所有語句之前;合併後,兩種賦值語句的順序保持它們在源代碼中順序。

類變量的初始化時機

    實例變量屬於Java類本身,只有當程序初始化該Java類時纔會爲該類的類變量分配內存空間,並執行初始化。
從程序運行的角度來看,每JVM 對一個Java類只初始化一次,因爲Java程序每運行一次,系統只爲類變量分配一次內存空間,執行一次初始化。
從語法角度來說,程序可以在兩個地方對類變量執行初始化
1定義類變量時指定初始值
2靜態初始化塊中對類變量指定初始值
這兩種方式的執行順序與它們在源程序中排列順序相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章