前面理解过java实例变量的初始化规则 朝花夕拾——看清java实例变量的初始化内幕
今天继续理清类变量的初始化顺序和细节,需要的朋友可以一起温习下。
类变量的初始化和实例变量的初始化很相似,相比实例变量初始化,少了构造器初始化的情况。大致只有:定义类变量时初始化和静态块中初始化两种情况。
规则:上述两种情况下,先对所有类变量进行申明并申请内存,在把赋值操作全部移动到静态块中进行初始化,顺序和源代码顺序一致。
首先理解下面代码
static double number = 100;
实际上JVM处理上述语句等价于
static double number; static{ number = 100; }
按照上述规则,给出完整例子
public class TestStatic { static double number = 100; static{ System.out.println("number = "+ number); count = 200; } static double count = 300; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("number = "+ number); System.out.println("count = "+ count); } }
按照规则,首先把double类型的number和count进行申明并申请内存(内存申请不做说明),并执行等价代码块和原来代码块,上述代码等价于下面代码
public class TestStatic { //static double number = 100; static double number; static double count; static{ number = 100; } static{ System.out.println("number = "+ number); count = 200; } //static double count = 300; static{ count = 300; } /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("number = "+ number); System.out.println("count = "+ count); } }
利用javap工具查看编译器源码,图下图
两种情况下的静态块赋值情况(左边为上述第二种源代码,右边为上述第一种源代码)
到此,类变量的初始化大致如上述。
时间: 2024-10-31 05:38:57