类的加载,初始化顺序

来源:互联网 发布:python 计算技术指标 编辑:程序博客网 时间:2024/05/29 14:20

java语言允许动态加载类,类加载是一个怎样的过程呢?

专家们将类加载过程分为三个阶段:加载,连接,初始化。其中连接又分为验证,准备,解析三个过程。

加载:JVM获取class文件

连接:验证class文件,准备内存空间,解析符号引用等,在这个过程中可能会引发加载其他的类。

初始化:为类变量赋初始值(如果需要的话),在这个过程中,JVM会将静态变量赋值语句和静态块语句按出现的顺序收集起来一一执行。

以上过程完成之后就可以使用这个类了,也就是可以实例化了。


看看下面的代码大概能对初始化的顺序有点体会。


子类代码:public class Subclass extends Parent {// 静态变量 private static String s_StaticField = "子类--静态变量"; // 变量 private String s_Field = "子类--变量"; // 静态初始化块 static {System.out.println(s_StaticField); System.out.println("子类--静态初始化块"); } // 构造器 public Subclass() { System.out.println("子类--构造器"); } // 初始化块 { System.out.println(s_Field); System.out.println("子类--初始化块"); } public static void f(){System.out.println("子类--静态方法");}public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println("主函数");//Subclass sub = new Subclass();Subclass.f();}}父类代码:public class Parent {private static String p_StaticField = "父类--静态变量"; private String p_Field = "父类--变量"; // 静态初始化块 static { System.out.println(p_StaticField); System.out.println("父类--静态初始化块"); } // 初始化块 { System.out.println(p_Field); System.out.println("父类--初始化块"); } // 构造器 public Parent() { System.out.println("父类--构造器"); } }//out:父类--静态变量父类--静态初始化块子类--静态变量子类--静态初始化块主函数子类--静态方法



以上代码,先加载main方法所在类的父类,执行父类的静态属性和静态块,再加载main方法所在类,执行子类的静态属性和静态块,再进入main函数。如果要创建对象的话,就要先执行初始化块,再执行构造器,如果有父类,则从父类开始初始化;如果不创建对象,则不执行初始化块和构造器。


原创粉丝点击