今天在写代码的时候突然想到了static 方法的使用和new对象调用方法的使用的区别,于是就研究了一下java中static关键字的用法。
java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种是实例变量,通常有new 关键字初始化。
在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。
在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
一个类无论创建了多少个实例对象,在内存中永远只分配了类中的一个静态变量
public class StaticMethod {
public static int staticVar=0;
public int instanceVar=0;
public void VarintTest(){
staticVar++;
instanceVar++;
System.out.println("staticVar="+staticVar+"instanceVar="+instanceVar);
}
}
在上面的代码中,每创建一个对象,staticVar中的值就会+1。而每创建一个对象,其中instanceVar的实例就会增加一个。
static变量的生命周期取决于类的生命周期。
类初始化顺序:
1)静态变量、静态代码块初始化
2)构造函数
3)自定义构造函数
结论:想要用static存一个变量,使得下次程序运行时还能使用上次的值是不可行的。因为静态变量生命周期虽然长(就是类的生命周期),但是当程序执行完,也就是该类的所有对象都已经被回收,或者加载类的ClassLoader已经被回收,那么该类就会从jvm的方法区卸载,即生命期终止。
更进一步来说,static变量终究是存在jvm的内存中的,jvm下次重新运行时,肯定会清空里边上次运行的内容,包括方法区、常量区的内容。