首页 > 代码库 > 对static关键字的理解

对static关键字的理解

作为一个初学者,在学习过程中,由于种种原因,一些基础的知识我们总是会忘记。当每次要用到时,又要百度搜集各种知识,大大降低学习效率。故记下这篇随笔,自己整理一下知识要点,方便以后查看。

 

static可用来修饰成员变量(静态变量),成员方法(静态方法)以及代码块(静态代码块)。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。相比较之下,非静态变量和方法依赖于对象,必须要实例化对象后才能够调用。

生命周期:当类被加载时,静态变量和静态方法就被加载到内存中,就是在内存中开辟一段内存地址用来保存静态变量和静态方法。一直到程序结束后才被释放。所以在静态方法或静态代码块不能直接(可以实例化后再引用)引用非静态变量和方法,也不能使用this和super关键字。

静态变量与实例变量的区别:对于静态变量来说,JVM在类加载的时候只为静态变量分配一次内存,以后的每次引用都不会再为其分配内存。而对于实例变量来说,每次new出一个对象,就分配一次内存。

静态代码块:静态代码块中定义的变量不同于静态变量,它只在代码块中有效!

final static修饰:对于一个变量,如果一旦赋值就不可修改,并且可以通过类名访问,就可以用final static修饰。对于一个方法,如果要其不可被覆盖,并且可以通过类名访问,也可以用final static修饰。

执行顺序测试:测试静态代码块,main方法的执行顺序。

 1 public class Test { 2 //    static {    编译错误 3 //        a = 4; 4 //        System.out.println(a); 5 //    } 6     private static int a = 0; 7      8     public static void main(String[] args) { 9         a = 3;10         System.out.println(a);11     }12     13     static {    //与main方法作比较14         a = 1;15         System.out.println(a);16     }17     18     static {    //与静态代码块作比较19         a = 2;20         System.out.println(a);21     }22 }

运行结果:

1

2

3

结果分析:静态代码块的执行顺序先于main方法,静态代码块之间以及和声明静态变量的执行顺序按其出现的先后顺序决定先后。

 

对static关键字的理解