静态变量和成员变量的区别

 

静态变量和成员变量的不同:

 

① 所属范围不同。静态变量是属于类范围的;成员变量是属于对象范围的。

② 存活时间不同。类的一生有着静态变量的伴随;而成员变量只能陪类走一程,对象产生的时候它就产生,而且它会随着对象的消亡而消亡。

③ 存储位置不同。静态变量时存储在方法区里的静态区;成员变量存储在堆栈内存区。

④ 调用方式不同。静态变量可以通过类名调用,也可以通过对象来调用;成员变量只能通过对象名调用。

 

接下来,就是稍微地理解一下上面说的这些不同啦~

①     所属范围不同

首先给出一小段代码,定义了静态变量和成员变量。

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);
    }
}

结果如下:

posted @ 2018-08-15 14:08  NYfor2018  阅读(5557)  评论(1编辑  收藏  举报