类的加载,初始化顺序
来源:互联网 发布: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函数。如果要创建对象的话,就要先执行初始化块,再执行构造器,如果有父类,则从父类开始初始化;如果不创建对象,则不执行初始化块和构造器。
- 类的加载,初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- Java类的加载及初始化顺序
- java类的加载以及初始化顺序
- 类的加载和初始化顺序
- 类的加载顺序,初始化块
- java类的加载以及初始化顺序
- java类的加载以及初始化顺序
- 初始化类时的加载顺序
- java类的加载以及初始化顺序
- 类的加载顺序以及静态成员初始化顺序
- java初始化的加载顺序
- 类加载与初始化顺序
- java 类加载-初始化顺序
- java类的加载以及初始化顺序&&阿里真题
- bootloader和bootstrap的区别
- php之jquery学习
- Android 中的 Service 全面总结
- c语言-连接!
- RCC_AHBPeriph_DMA DMA_Channel1 在那里定义的?
- 类的加载,初始化顺序
- LESS详解之函数(二)
- POJ 1979 Red and Black(BFS)
- nodejs入门级基础(数据类型,最基本的语法详解)
- 自定义导航栏
- POJ——多项式加法(WA)
- 小数如何转化为二进制
- fork函数
- PHP基础知识~~~待续~~~