在Java中static关键字有三种使用形式:
1.用于声明静态变量
2.用于声明静态函数或者说静态方法
3.用于声明静态代码块
1、用于静态变量
用于静态变量时,可以直接使用类名进行调用,如:
public class Person{ static int i }
而在调用i的时候,可以直接使用类名进行调用:
public class Test{ public static void main(String[] args){ Person.i = 10; } }
另外,静态变量还有其他的特点。
对于普通的成员变量,对于每一个对象中声明的i是指的是不同的内存地址空间,也就是说,不同的对象中的成员变量是各自独立的,如果对自己的成员变量进行修改,不会影响到其他的对象的成员变量。
但是对于静态的成员变量,则正好相反,静态成员变量对于所有的对象的引用,都是内存中的同一地址,也就是,所有的对象共享一个变量,如果其中的一个进行了修改,那么大家的值都会修改,换言之,静态成员变量在内存中只有一份,所有的对象都是共享这一份变量,如:
2、用于静态方法
static用于静态方法的时候,同样可以直接使用类名进行调用, 无需生成对象。如:
public class Person{ static int i; int j; static void fun(){ System.out.println("静态函数"); } }
public class Test{ public static void main(String[] args){ Person.i = 10; Person.fun(); } }
无需先进行对象的创建,直接使用类名调用就可以。
注意:在静态方法中不能使用非静态的变量
比如说,将上面的Person类的fun()方法进行修改,修改为:
static void fun(){ System.out.println("静态函数" + j); }
在println中调用了一个非静态变量 j,这时系统会报错:
错误: 无法从静态上下文中引用非静态 变量 j
System.out.println("静态函数" + j);
^
但是如果这个变量是静态的,比如将fun()再修改为调用 i :
static void fun(){ System.out.println("静态函数" + i); }
那么这时,编译过程就不会出错 了,因为 变量 i 也是静态的,静态方法可以调用静态的变量。
3、用于静态代码块
静态代码块声明就是用static后面加上一对花括号完成,然后再括号内填上要执行的代码,如:
public class Person{ static int i; int j; static{ System.out.println("静态代码块"); } static void fun(){ System.out.println("静态函数" + i); } }
中间的那部分,就是静态代码块,静态代码块,没有名字,方法有方法名,变量有变量名,但是静态代码块没有名字,直接就是这种格式,那么静态代码块是在什么时候被调用的呢,它是在类的装载时被调用的。比如,我们不通过main方法进行执行,而是直接通过 java Person进行调用,大家知道,这样程序肯定是会报错的,因为Person类中没有main方法,但是,运行的结果是:(注意,这个是根据mars老师的运行结果截的图,我在我自己的机子中运行,并没有打印出“静态代码块”这几个字,不知道是不是因为jdk版本的原因)
静态代码块不是很常用,它的主要作用就是用来对一些静态变量进行赋值操作。