首先弄明白:静态变量属于类的级别,而实例变量属于对象的级别。对于静态变量在内存中只有一个拷贝(节省内存),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就会加一。