靜態變量和成員變量的區別


 

靜態變量和成員變量的不同:

 

① 所屬范圍不同。靜態變量是屬於類范圍的;成員變量是屬於對象范圍的。

② 存活時間不同。類的一生有着靜態變量的伴隨;而成員變量只能陪類走一程,對象產生的時候它就產生,而且它會隨着對象的消亡而消亡。

③ 存儲位置不同。靜態變量時存儲在方法區里的靜態區;成員變量存儲在堆棧內存區。

④ 調用方式不同。靜態變量可以通過類名調用,也可以通過對象來調用;成員變量只能通過對象名調用。

 

接下來,就是稍微地理解一下上面說的這些不同啦~

①     所屬范圍不同

首先給出一小段代碼,定義了靜態變量和成員變量。

public class StaticTest{
    static int num01 = 9;
    public static void main(String[] args){
        int num02 = 10;
    }
}

用javap -p反編譯了一下,可以得到:

 

由此可知,靜態變量是隨着類的產生而產生的,而且成員變量只有在對象被創建的時候才會產生。

 

② 存活時間不同。

依然使用以上的源碼,使用javap -v反編譯一下:

 

由此可知,當num01產生了之后,在main()函數調用結束之后,num01還會保存下來,但是num02就會隨着對象的調用而消亡。

 

③ 存儲位置不同。

依然是使用以上的源碼,也是經過javap -v反編譯了一下:

 

此外我們可以看到,在”Constant pool”(常量池)里面只有num01的蹤跡,而沒有num02的蹤跡。

 

④ 調用方式不同。

重新寫一段代碼,我們可以看到num01是一個靜態變量,而且在test01()方法里面定義了成員變量num02,我們可以看到num01無論在哪里調用都行,但是成員變量只有在對象被調用的時候才會產生。

public class StaticTest{
    static int num01 = 9;
    public static void main(String[] args){
        System.out.println("Static Num:"+num01);
        StaticTest st =  new StaticTest();
        num01 = 11;
        st.test01();
    }
    public void test01(){
        int num02 = 10;
        System.out.println("Static Num:"+num01);
        System.out.println("Member Num:"+num02);
    }
}

結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM