本节可能令人感到不适,谨慎观看(本节为编译原理的引申节)
上一个程序我们写的时候,出现了一个关键字,static,这是什么东西呢?
static称为静态,被它修饰的变量称为静态变量(也称全局变量和类变量,之所以有这么多名字是观察它的点不同)。
静态变量:
静态变量具有全局属性,即一旦被静态变量修饰,在本类的所有位置,均可使用,这也是静态变量称为全局变量的原因。这不同于普通变量,类属性下的普通变量(也称类的属性)也要被普通方法使用需要this关键字,普通变量也不能被主方法直接使用(因为主方法是一个典型的静态方法)
那为什么静态变量右被称为类变量?因为静态变量是归属于类来初始化的,而普通变量归属于实例。所以其他类想使用本类的静态属性,只需类名.变量名即可。
ps:静态变量还有一个注意点是,它是被所有本类实例共享的变量,这在下一次课上解释了面向对象编程后再做说明。
停,就到这了,剩下的不说了。
是不是听的有点迷糊,那在加点料。
静态方法:
上面提到主方法是静态方法,在程序中显而易见,main方法的确被static修饰过嘛。静态方法有两个特点。
1:同静态变量,如果其他类想使用本类的静态方法,只需类名.方法名即可。
2:静态方法内部不能使用普通变量(类的属性)和普通方法,因此也不能使用this关键字。
ps:this关键字:本类方法调用本类属性,或本类方法调用本类方法使用。
静态代码块:
静态代码块是指在类加载过程中,只会执行一次的语句块。
ps:所谓的类加载过程,其实是字节码文件由jvm执行并分配空间的过程。
需要注意的是,并不是生成了class文件,就一定会触发类加载。
那么你是不是会有疑问,为什么static变量是全局的?为什么静态代码块只执行一次?为什么他们不需要创建实例就可以执行?
有想了解的,可以看我写的关于java代码如何一步步被虚拟机执行的,以及虚拟机在执行时,各部分又干了什么?
3.jvm的类加载机制
4.虚拟机内存图解及字节码执行过程
从jvm的角度来分析静态变量和静态方法