码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA 初始化顺序

时间:2015-09-07 22:35:02      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:

一、初始化顺序      

      无继承:静态变量、静态初始化块 > 变量、初始化块 > 构造函数

      有继承:静态变量、静态初始化块 > 父类初始化 > 子类初始化

      同一级别,按出现的顺序依次进行初始化。

技术分享
package initialization;

public class Insect {
    
    public String field0 = this.InitField("Insect:变量0");
    
    public static String staticField0 = StaticField("Insect:静态变量0");
    
    public String field1 = this.InitField("Insect:变量1");
    
    static {
        
        System.out.println("Insect:静态出初始化块");
    }
    
    public String field2 = this.InitField("Insect:变量2");
    
    {
        System.out.println("Insect:初始化块");
    }
    
    public String field3 = this.InitField("Insect:变量3");
    
    Insect(){
        
        System.out.println("Insect:构造函数");
    }
    
    public String field4 = this.InitField("Insect:变量4");
    
    public static String staticField1 = StaticField("Insect:静态变量1");
    
    public static String StaticField(String s){
        
        System.out.println(s);
        
        return " ";
    }
    
    public String InitField(String s){
        
        System.out.println(s);
        
        return " ";
    }
}
父类
技术分享
package initialization;

public class Beetle extends Insect {

    static {

        System.out.println("Beetle:静态出初始化块");
    }

    {
        System.out.println("Beetle:初始化块");
    }

    Beetle() {
 
        System.out.println("Beetle:构造函数");
    }    
}
子类
技术分享
package initialization;

public class Test {
    
    public static void main(String[] args){
        
        /*
         *测试无继承,初始化顺序
         */
        //Insect insect = new Insect();
        
        /*
         * 测试继承,初始化顺序
         */
        //Beetle beetle = new Beetle();
        
    }

}
测试类

二、类的初始化(JVM

     a、加载:将字节码二进制.class文件加载到内存。

     b、连接

       1.验证:验证内存中字节码是否符合jvm规范。

       2.准备:为类的静态变量分配内存,并初始化默认值。

       3.解析:把类的符号引用转为直接引用

     c、初始化:将类的静态变量赋予定义的初始值,非默认值。

三、类的初始化步骤 

     a、如果该类没有被加载和连接,那首先进行加载及连接。

     b、如果该类存在直接父类,且父类未被初始化,那先对其直接父类进行初始化。

     c、如果该类存在初始化语句,那依次执行这些初始化语句。             

     PS:静态变量及静态初始化块都可被看作是类的初始化语句。

四、类的主动使用与被动使用

     主动使用:

     1.创建类的实例

     2.访问某个类或接口的静态变量,或为该静态变量赋值

     3.调用类的静态方法

     4.反射

     5.初始化一个类的子类

     6.jvm启动时,被标明为启动类的类

     被动使用:其它使用java类的方式,不会导致类的初始化。

     例,使用ClassLoader加载一个类,并不是对类的主动使用,不会导致类的初始化。

技术分享
package initialization;

public class ClassLoaderInitTest {

    public static void main(String[] args) {

        ClassLoader loader = ClassLoader.getSystemClassLoader();

        try {

            @SuppressWarnings("unused")
            Class<?> cl = loader.loadClass("initialization.CL");
            
            System.out.println("**********************************");
            
            cl = Class.forName("initialization.CL");
            
        } catch (ClassNotFoundException e) {

            e.printStackTrace();
        }
    }
}

class CL {

    static {

        System.out.println("CL:init");
    }
}
测试

 

JAVA 初始化顺序

标签:

原文地址:http://www.cnblogs.com/wscy/p/4790003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!