静态成员归整个类所有,不依赖类特定的实例,是被类的所有实例共享。只要这个类被JVM加载,就可以根据类名在全局数据区域内找到它们。因此,静态成员可以在任何对象创建之前访问而无需访问对象。
static 静态变量
static关键字修饰的成员变量称为静态成员变量,简称静态变量。静态变量是属于类,但是不依赖类特定的实例。静态变量在类创建后就一直存在,其生命周期和所在类的生命周期是一样的,且被类的所有实例共享。若一个类有多个实例对象,那么这些实例对象都可以共享该静态变量。也可以在没有创建实例对象时,通过类名来访问该类的静态变量。
实例变量和静态变量有如下几点区别。
1,对于实例变量,每创建一个实例,JVM就会为实例变量分配一次内存,实例变量可以在内存中有多个备份,互相不影响,实例变量隶属于对象。在类内部,非静态方法可以直接访问实例变量。本类中的静态方法或其他类则需要通过本类的实例对象访问实例变量。
2,对于静态变量,加载类的过程中完成静态变量的内存分配,JVM只为静态变量分配一次内存,而且静态变量在内存中只有一个备份。静态变量可以被所有对象之间共享。在本类中,任何方法都可以直接访问静态变量,当然也可以通过对象来访问(一般不这样)。在其他类中,则需要通过类名来访问静态变量
通过下面的例程能更加直观的了解静态变量:
public static void main(String[] args) {
int x=staticTest01.tic--;
System.out.println("x="+x+" ,tic="+staticTest01.tic);
int y=staticTest01.tic--;
System.out.println("y="+y+" ,tic="+staticTest01.tic);
staticTest01 st=new staticTest01();
int k=staticTest01.tic--;
System.out.println("k="+k+" ,tic="+staticTest01.tic);
staticTest01 st2=new staticTest01();
int m=st2.tic--;
System.out.println("m="+m+" ,tic="+staticTest01.tic);
st2.rightTask();
staticTest01.leftTask();
}
}
class staticTest01
{
public static int tic=10;
public int cit=10;
public void rightTask() {
tic--;
cit++;
getCit();
System.out.println("rightTask: tic="+tic);
}
public int getCit() {
return cit;
}
public static void leftTask() {
int i=tic-2;
staticTest01 stx=new staticTest01();
stx.cit++;
stx.getCit();
System.out.println("leftTask: tic="+i);
}
静态变量有以下几个作用:(1)静态变量被所有的实例共享,因此可以作为实例之间的共享数据,增加实例之间的交互性。(2)静态变量可以让类中的所有实例包含同一个常量属性。
static方法—常态方法
静态方法与静态变量一样属于类,静态方法在类创建后就一直存在,其生命周期和所在类的生命周期是一样的,也可以在没有创建实例对象时,通过类名来访问该类的静态方法。静态方法不能访问非静态的实例变量和实例方法。
实例方法和静态方法的区别如下:
1,静态方法可以不通过本类的实例对象而通过“类名.静态方法名”就可以调用。静态方法不能访问本类的实例变量和实例方法,但是可以访问静态成员。静态方法中不能使用this关键字和super关键字,因为这两个关键字和特定的实例变量相关。
2,实例方法可以访问静态成员,包括静态变量、静态常量、静态方法、实例变量和实例方法。但是静态方法不能直接访问实例变量和调用实例方法。