静态变量:独立存在的变量,只是位置放在某个类下,可以直接类名加点调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是同样,可以直接调用。
实例变量:就是相当于该类的属性,需要先初始化该类,就是new 该类后,才可以调用。但是该类未被再次使用,被垃圾回收器回收后,该实例也将不存在了,就是不在内存中了。
区别如下:
1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中;
2.静态变量与类相关,普通变量则与实例相关。
3.内存分配方式不同。
4.生命周期不同。
实例变量又称成员变量:
成员变量定义在类中,在整个类中都可以被访问。
成员变量随着对象的建立而建立,随对象的消失而消失,存在于对象所在的对内存中。
成员变量有默认初始值
局部变量:
定义在方法中或方法的参数列表(或者语句中)
存在于栈内存中,作用的范围结束,变量空间自动释放。
默认没有初始化值,使用时需要进行初始化。
静态变量又称类变量:用static修饰。
存储在方法区中
随着类的加载而存在,随着类的消失而消失。
可以由类名或对象调用
伪代码说明
public class Variable{ 。
static int a = 0; //类变量。
String b = "hello world";//实例变量。
public void method(){ 。
int c = 0; //局部变量。
}
静态变量: 用关键字static修饰的成员变量称作静态变量或类变量;
实例变量:没有使用static修饰的成员变量称作实例变量。
静态变量是与类相关联的数据变量,类变量不仅可以通过某个对象访问也可以直接通过类名访问。
实例变量仅仅是和相应的对象关联的变量,改变其中一个对象的实例变量不会影响其它对象的这个实例变量。实例变量必须通过对象访问。
首先很能理解你求知而无解的心情,因为我也是过来人。
静态变量是类相关的变量,所以他的生命周期是从这个累被声明,到这个类彻底被垃圾回收机制彻底回收才会被销毁。
实例变量是这个类的对象里的变量,它和静态变量不同,它只能由创建出的对象来调用,所以实例变量是从这个对象(其实就是实例)被创建开始,直到这个对象没有任何引用变量去引用它,最终被垃圾回收站回收,这时这个实例变量也跟着就消失了。
总而言之:静态变量生命周期就是类的开始和销毁。
实例变量生命周期就是对象的开始和销毁。‘
不知道这样说你能懂不,看着这些,自己好好理解理解,有时候不经意间就懂了呵呵。
运行效果:控制台效果:==================================================代码部分==================================================/hello_test/src/com/b510/test/StaticTest.java 1/** 2 * 3*/ 4package com.b510.test; 5 6/** 7 * 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,<br> 8 * 其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某<br> 9 * 个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,<br> 10 * 不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。<br> 11 * 总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以<br> 12 * 直接使用类名来引用。例如,对于下面的程序,无论创建多少个实例对象,<br> 13 * 永远都只分配了一个<code>staticInt</code>变量,并且每创建一个实例对象,<br> 14 * 这个<code>staticInt</code>就会加1;但是,每创建一个实例对象,就会分配一个<code>random</code>,<br> 15 * 即可能分配多个<code>random</code>,并且每个<code>random</code>的值都只自加了1次。<br> 16 * 17 * @author <a href="mailto:hongtenzone@foxmail.com">hongten</a> 18 * @date 2013-3-2 19*/20publicclass StaticTest { 2122privatestaticint staticInt = 2; 23privateint random = 2; 2425public StaticTest() { 26 staticInt++; 27 random++; 28 System.out.println("staticInt = "+staticInt+" random = "+random); 29 } 3031publicstaticvoid main(String[] args) { 32 StaticTest test = new StaticTest(); 33 StaticTest test2 = new StaticTest(); 34 } 35 }。