static关键字在平时项目开发和阅读代码时经常会遇到,本文对static关键字的用法做一个全面的介绍,主要分为以下三部分:
1、static变量
2、static方法
3、static代码块
笔者能力有限,若有不正之处欢迎批评指正。
请尊重笔者劳动成果,转载请标明出处。
1、static变量
static变量,即静态变量,有的文章中也叫作类变量,与非静态变量(实例变量)的区别在于,静态变量对于每个类来说只有一份存储空间,该类实例化的所有对象共用这一个变量,当类被加载时即完成初始化,调用该变量时推荐使用“类名.变量名”的方式,当然也可以通过“对象名.变量名”。而非静态变量,该类的每个实例化对象都有一份存储空间,并且它们之间互不影响,只有创建新的对象时才会进行初始化。这里需要注意的是,static只能用来修饰类的属性变量,不能用来修饰方法里的局部变量。
2、static方法
《java编程思想》中对static方法的表述是“static方法就是没有this的方法”,从这句话可以看出static方法的内部不应该有某一特定对象的属性和方法,这也就是为什么静态方法不可以调用非静态变量和非静态方法,但是反过来倒是可以的。参见下面的例子:
再从另外一个方面来阐述为什么静态方法中不能调用非静态方法和非静态变量,因为当类被加载后,就可以通过类名.静态方法名,来调用静态方法,而非静态方法和非静态变量只有创建对象时才拥有,如果你在创建对象之前就调用静态方法那么就会出矛盾,因为根本就没有对象被创建。
所以说如果想要不创建任何对象就能够调用类的方法,那么就需要把方法定义为static方法,这也是为什么main方法总是static方法的原因,因为程序在执行main方法时根本就没有创建对象。
注意:java的构造方法是隐式的静态方法
3、static代码块
static代码块常用来提升程序的小性能,这也是比较常用的一个地方。因为static代码块可以定义在代码的任意位置,可以有任意多个static代码块;当类被加载时,按照定义的顺序执行这些代码块,且只执行一次。
虽然main方法中没有任何操作,但是当执行这段程序时,类被加载以后,会按顺序执行static代码块,所以会按照顺序打印出static代码块的信息。
参考资料:
《java编程思想》