关键字static,静态

来源:互联网 发布:js身份证号码格式验证 编辑:程序博客网 时间:2024/05/23 17:14
 static

虚拟机准备阶段是正式为类变量(static修饰的类成员变量)分配内存并设置类变量初始值的阶段,这些变量使用的内存都在方法区中进行分配。
  • 这时只对类变量进行内存分配,不包括实例变量。实例变量在对象初始化时随对象一起分配在Java堆中。
  • 初始值“通常情况”下是数据类型的默认值(int——0,boolean——false……)

public static int value = 123;
那么类变量value在准备阶段过后的初始值为0,而不是123.因为这时尚未开始执行任何Java方法,而把value赋值为123的putstatic指令是指程序被编译后,存放于类构造器<clinit>()方法中,所以把value赋值为123的动作在初始化阶段才会执行。

java类的成员变量有俩种:一种是被static关键字修饰的变量,叫类变量或者静态变量;另一种没有static修饰,为实例变量

    在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。

    在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,只要程序加载了类的字节码,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。

    类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。

而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。


静态块在第一个对象创建时运行

初始化块在每个对象创建时运行

区别是静态块只执行一次,操作的内存在静态区

初始化块每个对象构造时都需要执行一次,操作的内存在用户区

0 0