java中的静态变量和实例变量的区别
在Java中,静态变量(也称为类变量)和实例变量是两种不同类型的变量,它们在多个方面存在显著的区别。以下是它们之间的一些主要区别:
存储位置
- 静态变量:存储在方法区(在Java 8及之后版本,方法区被称为元空间)的静态区域中,被类的所有实例共享。即,无论创建多少个类的实例,静态变量只有一份拷贝。
- 实例变量:存储在堆内存中,每个类的实例都有自己的一份拷贝。即,每当你创建一个类的实例时,都会为实例变量分配内存。
访问方式
- 静态变量:可以通过类名直接访问(无需创建类的实例),也可以通过实例名访问。访问静态变量的一般语法是
类名.静态变量名
或实例名.静态变量名
。 - 实例变量:只能通过类的实例来访问。访问实例变量的一般语法是
实例名.实例变量名
。
生命周期
- 静态变量:静态变量的生命周期贯穿整个应用程序。只要类被加载到JVM中,静态变量就存在,直到类被卸载。
- 实例变量:实例变量的生命周期与对应的实例相同。实例变量在对象被创建时创建,在对象被销毁时销毁。
用途
- 静态变量:通常用于描述类的属性,即所有对象共有的属性。例如,在表示学生类的场景中,学校的名称可能是一个静态变量,因为所有学生都属于同一所学校。
- 实例变量:用于描述对象的特定属性,即每个对象可能拥有不同的属性值。例如,学生的姓名、年龄和分数都是实例变量,因为每个学生的这些属性都是不同的。
初始化
- 静态变量:可以在声明时初始化,或者在静态代码块中初始化。静态变量在类被加载到JVM时初始化,且只初始化一次。
- 实例变量:可以在声明时初始化,也可以在构造方法中初始化,或者在实例初始化块中初始化。每次创建类的实例时,实例变量都会被初始化。
内存分配
- 静态变量和实例变量在内存中的分配区域不同,如上所述,静态变量存储在方法区的静态区域,而实例变量存储在堆内存中。
代码演示说明
以上从概念上说明了两者之前的区别,下面举一个简单的例子例证下,有个更直观的感受。
class VariantTest{
public static int staticVar = 0;
public int instanceVar = 0;
public VariantTest(){
staticVar++;
instanceVar++;
System.out.println("staticVar=" + staticVar + ",instanceVar=" + instanceVar);
}
}
@Test
public void test3(){
VariantTest variantTest = new VariantTest();
VariantTest variantTest2 = new VariantTest();
VariantTest variantTest3 = new VariantTest();
}
如上是一个类中有一个静态变量staticVar和一个实例变量instanceVar,构造方法中分别对这两个变量+1,我们先看结果
staticVar=1,instanceVar=1
staticVar=2,instanceVar=1
staticVar=3,instanceVar=1
从结果可以一目了然的看出,静态变量其实每次创建新的对象都没变,始终是同一个进行加1操作,所以结果一直累加,而实例变量则是每次创建新的对象时重新创建,所以每次都是1。由此可以看出静态变量在类被加载到JVM时初始化,且只初始化一次。实例变量每次创建类的实例时,实例变量都会被初始化。