靜態變量和成員變量的不同:
① 所屬范圍不同。靜態變量是屬於類范圍的;成員變量是屬於對象范圍的。
② 存活時間不同。類的一生有着靜態變量的伴隨;而成員變量只能陪類走一程,對象產生的時候它就產生,而且它會隨着對象的消亡而消亡。
③ 存儲位置不同。靜態變量時存儲在方法區里的靜態區;成員變量存儲在堆棧內存區。
④ 調用方式不同。靜態變量可以通過類名調用,也可以通過對象來調用;成員變量只能通過對象名調用。
接下來,就是稍微地理解一下上面說的這些不同啦~
① 所屬范圍不同
首先給出一小段代碼,定義了靜態變量和成員變量。
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); } }
結果如下:

