美文网首页
static 关键字

static 关键字

作者: 张轻舟 | 来源:发表于2018-08-23 22:30 被阅读7次

    static 修饰符能够与变量、方法一起使用,表示是“静态”的。

    静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法。静态变量与实例变量不同,实例变量总是通过对象来访问,因为它们的值在对象和对象之间有所不同。

    例子:

    public class Demo { static int i = 10; int j; Demo() { this.j = 20; } public static void main(String[] args) 
    { System.out.println("类变量 i=" + Demo.i); 
    Demo obj = new Demo(); 
    System.out.println("实例变量 j=" + obj.j); } }
    
    运行结果:
    类变量 i=10
    实例变量 j=20
    
    static 的内存分配

    静态变量属于类,不属于任何独立的对象,所以无需创建类的实例就可以访问静态变量。之所以会产生这样的结果,是因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间,虽然有多个实例,但这些实例共享该内存。实例变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立,互不影响,改变 a 对象的实例变量不会影响 b 对象。

    请看下面的代码:

    public class Demo { static int i; int j; public static void main(String[] args) 
    { Demo obj1 = new Demo(); obj1.i = 10; obj1.j = 20; Demo obj2 = new Demo(); 
    System.out.println("obj1.i=" + obj1.i + ", obj1.j=" + obj1.j); 
    System.out.println("obj2.i=" + obj2.i + ", obj2.j=" + obj2.j); } }
    运行结果:
    obj1.i=10, obj1.j=20
    obj2.i=10, obj2.j=0
    

    上面的代码中,i 是静态变量,通过 obj1 改变 i 的值,会影响到 obj2;j 是实例变量,通过 obj1 改变 j 的值,不会影响到 obj2。这是因为 obj1.i 和 obj2.i 指向同一个内存空间,而 obj1.j 和 obj2.j 指向不同的内存空间,请看下图:
    注意:静态变量虽然也可以通过对象来访问,但是不被提倡,编译器也会产生警告。


    qq_pic_0.jpg

    注意:static 的变量是在类装载的时候就会被初始化。也就是说,只要类被装载,不管你是否使用了这个static 变量,它都会被初始化。

    小结:类变量(class variables)用关键字 static 修饰,在类加载的时候,分配类变量的内存,以后再生成类的实例对象时,将共享这块内存(类变量),任何一个对象对类变量的修改,都会影响其它对象。外部有两种访问方式:通过对象来访问或通过类名来访问。

    相关文章

      网友评论

          本文标题:static 关键字

          本文链接:https://www.haomeiwen.com/subject/yzjmiftx.html