Java类初始化顺序分析

来源:互联网 发布:tcp udp端口号小于 编辑:程序博客网 时间:2024/06/06 06:36

      近来碰到了Java类初始化顺序的问题(主要是静态部分),故整理在此。因为Java虚拟机部分还没研究完,所以先写一点编程中出现的情况,至于原理和为什么以后再补充。

 

首先提一下:

1、类(静态)变量

     虚拟机对类(静态)变量当作声明类型的一部分数据存储在方法区

2、编译时常量

    编译时常量(即用final声明以及编译时就已知值的初始化的类变量)不同,每个使用编译时常量的类型都会复制它的所有常量到自己的常量池中。

3、类变量作为声明它们的类型的一部分数据而保存,编译时常量作为使用它们的类型的一部分而保存。作为常量池或字节码流的一部分,编译时常量被保存在方法区中 --- 就和一般的类变量一样。

 

以下进入正题

一、Java类总体初始化顺序为:1、静态部分(a.静态变量 b.静态初始化块)2、非静态部分(a.变量 b.初始化块 c.构造器)

二、静态部分初始化顺序为:声明顺序(静态成员和静态代码快)。但要注意的是如果类型为final的原始类型则在用到时即初始化,而引用类型(即使为final类型)仍然根据顺序初始化。示例代码:

    static
    {
        showInfo();
    }

    public static void showInfo()
    {
        System.out.println(a);
        System.out.println(c);
    }

    // 静态变量
    public static TestA a = new TestA();
    public static int c = 10;

 

    当a和c都不为final时侯,将打印null和0.如果为final,则打印null和10

三、非静态部分初始化顺序为:声明顺序

四、类继承体系初始化顺序:a.父类静态部分b.子类静态部分c.父类非静态部分d.子类非静态部分

原创粉丝点击