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 }