首先弄明白:静态变量属于类的级别,而实例变量属于对象的级别。对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 

主要区别有两点:

1,存放位置不同

实例变量随着对象的对象的建立存在于堆内存中。

2,生命周期不同

  类变量的生命周期最长,随着类的加载而加载,随着类的消失而消失,

  实例变量随着对象的消失而消失。

静态的使用注意事项:

1,静态方法只能访问静态成员(包括成员变量和成员方法),不能访问非静态成员或方法。

  非静态方法可以访问静态也可以访问非静态方法或成员。

2,静态方法中不能出现this,super关键字。

  因为静态是优先于对象存在的,所以不能出现this,super关键字

3,主函数是静态的。

下面是静态变量与实例变量的一段程序:

public class StaticTest {

/**
  * 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,
  * 其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某
  * 个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,
  * 不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。
  * 总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以
  * 直接使用类名来引用。例如,对于下面的程序,无论创建多少个实例对象,
  * 永远都只分配了一个<code>staticInt</code>变量,并且每创建一个实例对象,
  * 这个<code>staticInt</code>就会加1;但是,每创建一个实例对象,就会分配一个<code>random</code>,
  * 即可能分配多个<code>random</code>,并且每个<code>random</code>的值都只自加了1次。<br>

*/

private static int staticInt = 2;//静态变量
    private int random = 2;//实例变量

    public StaticTest() {
        staticInt++;
        random++;
        System.out.println("staticInt = "+staticInt+"  random = "+random);
    }

    public static void main(String[] args) {
        StaticTest test = new StaticTest();
        StaticTest test2 = new StaticTest();
    }

}
结果:
staticInt = 3 random = 3
staticInt = 4  random = 3

总结:

实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。每创建一个实例对象,就会分配一个random,实例对象之间的random是互不影响的,所以就可以解释为什么输出的两个random值是相同的了。

静态变量不属于某个实例对象,而是属于整个类。只要程序加载了类的字节码,不用创建任何实例对象,静态变量就回被分配空间,静态变量就可以被使用了。无论创建多少个实例对象,永远都只分配一个staticInt 变量,并且每创建一个实例对象,staticInt就会加一。