一、 静态变量:独立存在的变量,只是位置放在某个类下,可以直接类名加点(.)调用静态变量名使用。并且是项目或程序一启动运行到该类时就直接常驻内存。不需要初始化类再调用该变量。用关键字static声明。静态方法也是同样,可以直接调用。 实例变量:就是相当于该类的属性,需要先初始化(实例化)该类,就是new 该类后,才可以调用。但是该类未被再次使用,被垃圾回收器回收后,该实例也将不存在了,就是不在内存中了。
下面是上述两类的区别:
1.存储区域不同:静态变量存储在静态存储区,普通变量存储在堆中; 2.静态变量与类相关,普通变量则与实例相关,如下Demo所示: class Demo { public static String a; public String b; public static void main(String[] args) { Demo d = new Demo(); d.a; // 警告,虽然可以通过编译,但没有意义 d.b; // 正确 Demo.a; // 对static变量的正确引用 Demo.b; // 错误 } 3.内存分配方式不同。static字段对每个类来说都只有一份,无论你创建多少对象,该static区域都只有一份,它对于这些对象来说是共享的;而非static字段,因为其从属于对象,因此每有一个对象,就会为该变量申请一个存储空间; 4.生命周期不同。从程序运行开始,static域就已经确定下来,因此在没有创建对象之前,就可以引用该区域变量及函数,而非static域的变量及函数,必须等(类)实例化之后才可以通过对象来调用。 5.理解了this之后,更能体会到static的含义。static方法就是没有this的方法,这也就是为什么在static方法中不能引用非static变量,因为该方法内没有隐含的this,编译器无从知道这个变量是属于哪一个类的。二、静态变量的初始化1、最常用的初始化静态变量的操作是在声明变量时直接进行赋值操作
</pre><pre name="code" class="java">package day05; public class staticTest { static{ _i =20 ;} public static int _i = 10; public static void main(String[] args){ System.out.println(_i); } }
2、静态变量是通过赋值操作进行初始化的,因此可以通过静态函数返回值的方式为其初始化
返回结果也是10package day05; import javax.naming.InitialContext; public class staticTest { static{ _i =init() ;} public static int _i = init(); private static int init(){ return 10; } public static void main(String[] args){ System.out.println(_i); } }
3、不仅类定义中可以有多个static块,而且在编译时编译器会将多个static块按照代码的前后位置重新组合成一个static块。
package day05; public class staticTest { public static int _i; static{ _i = 20; _i = 10; } public static void main(String[] args){ System.out.println(_i);//输出10,若是_i =20写在下面,则输出20 } }
静态变量被保存到常量池中的工作原理这里不深入讨论。在此需要注意的是:
- 静态变量的声明与初始化是两个不同的操作;
- 静态变量的声明在编译时已经明确了内存的位置。