Java 之类的加载顺序
2016-05-25 22:06
211 查看
1.java中最多的是类,那么类的加载顺序又是什么呢?
其实好多时候,自己并不知道自己写的什么东西,只是简单的拷贝复制,这样根本就不会深刻的体会到真谛!!!
1.1类加载:并不是一开始就去所有的类都会完成类加载(5各阶段,加载,验证,准备,解析,初始化!!)。
1.2只有类初始化阶段,才会真正开始执行类中定义的java程序代码(包括你写的,还有第三方的代码;字节码)!!!
2.单纯的类中有静态变量,静态方法,非静态变量,非静态方法,构造方法;静态代码块,代码块等
3.加载顺序:
1)、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
2)、只有在调用new方法时才会创建类的实例
3)、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法
4)、类实例销毁时候,首先销毁子类部分,再销毁父类部分
4.一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段:
加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载
5.其中加载(除了自定义加载)+链接的过程是完全由jvm负责的,什么时候要对类进行初始化工作(加载+链接在此之前已经完成了),jvm有严格的规定(五种情况):
1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,假如类还没进行初始化,则马上对其进行初始化工作。其实就是3种情况:用new实例化一个类时、读取或者设置类的静态字段时(不包括被final修饰的静态字段,因为他们已经被塞进常量池了)、以及执行静态方法的时候。
2.使用java.lang.reflect.*的方法对类进行反射调用的时候,如果类还没有进行过初始化,马上对其进行。
3.初始化一个类的时候,如果他的父亲还没有被初始化,则先去初始化其父亲。
4.当jvm启动时,用户需要指定一个要执行的主类(包含static void main(String[] args)的那个类),则jvm会先去初始化这个类。
5.用Class.forName(String className);来加载类的时候,也会执行初始化动作。注意:ClassLoader的loadClass(String className);方法只会加载并编译某类,并不会对其执行初始化。
其实好多时候,自己并不知道自己写的什么东西,只是简单的拷贝复制,这样根本就不会深刻的体会到真谛!!!
1.1类加载:并不是一开始就去所有的类都会完成类加载(5各阶段,加载,验证,准备,解析,初始化!!)。
1.2只有类初始化阶段,才会真正开始执行类中定义的java程序代码(包括你写的,还有第三方的代码;字节码)!!!
2.单纯的类中有静态变量,静态方法,非静态变量,非静态方法,构造方法;静态代码块,代码块等
3.加载顺序:
1)、虚拟机在首次加载Java类时,会对静态初始化块、静态成员变量、静态方法进行一次初始化
2)、只有在调用new方法时才会创建类的实例
3)、类实例创建过程:按照父子继承关系进行初始化,首先执行父类的初始化块部分,然后是父类的构造方法;再执行本类继承的子类的初始化块,最后是子类的构造方法
4)、类实例销毁时候,首先销毁子类部分,再销毁父类部分
4.一个java文件从被加载到被卸载这个生命过程,总共要经历5个阶段:
加载->链接(验证+准备+解析)->初始化(使用前的准备)->使用->卸载
5.其中加载(除了自定义加载)+链接的过程是完全由jvm负责的,什么时候要对类进行初始化工作(加载+链接在此之前已经完成了),jvm有严格的规定(五种情况):
1.遇到new,getstatic,putstatic,invokestatic这4条字节码指令时,假如类还没进行初始化,则马上对其进行初始化工作。其实就是3种情况:用new实例化一个类时、读取或者设置类的静态字段时(不包括被final修饰的静态字段,因为他们已经被塞进常量池了)、以及执行静态方法的时候。
2.使用java.lang.reflect.*的方法对类进行反射调用的时候,如果类还没有进行过初始化,马上对其进行。
3.初始化一个类的时候,如果他的父亲还没有被初始化,则先去初始化其父亲。
4.当jvm启动时,用户需要指定一个要执行的主类(包含static void main(String[] args)的那个类),则jvm会先去初始化这个类。
5.用Class.forName(String className);来加载类的时候,也会执行初始化动作。注意:ClassLoader的loadClass(String className);方法只会加载并编译某类,并不会对其执行初始化。
相关文章推荐
- Eclipse中的Maven插件运行项目中的Goals设置
- 设计模式的学习——工厂模式
- JAVA泛型 一
- 配置java 和tomacat环境过程
- Java IO - CharArrayReader&CharArrayWriter
- maven搭建ssm分模块框架 (myeclipse版) (二) 较详细版
- java 基础拾漏
- 第一个算法优化例子
- Java synchronized详解
- java享元设计模式
- Java语言的发展及其特点
- Java入门篇
- 关于java中一些代码的理解
- javaSE 模拟Spring框架的Ioc
- Java系统工具jps原理解析
- Spring 计划 7.0
- Java中HashMap、TreeMap的区别
- Eclipse快捷键 10个最有用的快捷键
- java synchronized详解
- eclipse导入项目,项目名出现红叉的情况