静态变量也叫类变量,这种变量前加了static修饰符。可以直接用类名调用,也可以用对象调用,而且所有对象的同一个类变量 都是共享同一块内存空间。
实例变量也叫对象变量,这种变量没有加static修饰符。只能通过对象调用, 而且所有对象的同一个实例变量是共享不同的内存空间的。
区别在于:
静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后的值;
实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象仍会得到实例变量一开始就被赋予的值。
例:public class A{
static int a = 0; // 这是静态变量
int b = 0; // 这是实例变量
}
public class B{
public static void main (String[] args){
A a1 = new A();
A a2 = new A();
a1.a = 3; // 对象a1将3赋值给a
a1.b = 4 ; // 对象a1将4赋值给“它自己的b”
System.out.println(a2.a); //结果为3//静态变量是针对所有对象的,所以a1改变a的值,a2获取到的a的值也改变了的
System.out.println(a2.b); //结果为0
//实例变量只改变自身所获取的值,所以a1获取的b的值改变了,不影响a2获取的b的值
}
}
在创建实例对象的时候,内存中会为每一个实例对象的每一个非静态成员变量开辟一段内存空间,用来存储这个对象所有的非静态成员变量值。即使两个不同的实例对象是属于同一个类,它们的同名非静态成员变量在内存中占用的空间是不同的。
静态成员变量有所不同。所有的实例对象都共用一个静态变量,内存中只有同一处空间存放这个静态变量值的。因此,如果一个对象把静态变量值改了,另外一个对象再取静态变量值就是改过之后的值了。