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 }