静态变量和成员变量的区别
静态变量和成员变量的不同:
① 所属范围不同。静态变量是属于类范围的;成员变量是属于对象范围的。
② 存活时间不同。类的一生有着静态变量的伴随;而成员变量只能陪类走一程,对象产生的时候它就产生,而且它会随着对象的消亡而消亡。
③ 存储位置不同。静态变量时存储在方法区里的静态区;成员变量存储在堆栈内存区。
④ 调用方式不同。静态变量可以通过类名调用,也可以通过对象来调用;成员变量只能通过对象名调用。
接下来,就是稍微地理解一下上面说的这些不同啦~
① 所属范围不同
首先给出一小段代码,定义了静态变量和成员变量。
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); } }
结果如下: