java类的成员变量有两种:
一种是被static关键字修饰的变量,叫类变量或者静态变量;
另一种实例变量也叫对象变量,即没加static 的变量。
程序运行时的区别:
实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。
静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。
例如:
public class VariantTest { public static int staticVar = 0; public int instanceVar = 0; public VariantTest(){ staticVar++; instanceVar++; System.out.println("staticVar=" + staticVar + ",instanceVar=" + instanceVar); } public static void main(String[] args) { VariantTest test1 = new VariantTest(); VariantTest test2 = new VariantTest(); VariantTest test3 = new VariantTest(); } }
结果为:
staticVar=1,instanceVar=1 staticVar=2,instanceVar=1 staticVar=3,instanceVar=1
对于上面的程序,无论创建多少个实例对象,永远都只分配了一个staticVar变量,并且每创建一个实例对象,这个staticVar就会加1;但是,每创建一个实例对象,就会分配一个instanceVar,即可能分配多个instanceVar,并且每个instanceVar的值都只自加了1次。
类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象.
例如:
public class A{ static int a = 0; //类变量 private int b = 0; //实力变量 } public class B{ public void main (String[] args){ A a1 = new A(); A a2 = new A(); a1.a = 3; // 等同于 A.a = 3; a1.b = 4 ; System.out.println(a2.a); //结果为3 //类变量是针对所有对象的,所以a1改变a,a2的a也改变 System.out.println(a2.b); //结果为0 //实例只改变自身的,所以a1对象的b改变,不影响对象a2的b变量 }
静态变量的另一个用途是定义静态常量,比如: public static double PI = 3.1415926;
这样的静态常量可以无需创建对象就直接使用,省略了创建对象的步骤,类似于C语言中用define定义的常量。这样定义常量,不仅使用方便,而且节省内存空间。在JDK中,存在着大量的这种静态常量。
实例变量与局部变量的一个简单对比:
1 public class Example{ 2 //实例方法中的实例变量和局部变量的作用范围 3 private int var;//实例变量 4 ... 5 6 private void method1(){ 7 int var;//局部变量 8 ...var...//调用的是局部变量而非实例变量 9 ...this.var...//调用实例变量 10 } 11 private void method2(){ 12 ...var...//调用实例变量 13 } 14 ... 15 }