java类的加载与初始化总结

1、触发类加载的原因(主动调用与被动调用):

    六种主动调用:

      1)、创建类的实例(new操作、反射、cloning、反序列化)

      2)、调用类的静态方法

      3)、使用或对类/接口的static属性赋值(不包括static final的与在编译期确定的常量表达式(包括常量、字符串常量))

      4)、调用API中的反射方法,Class.forName()等。

      5)、子类被初始化

      6)、被设定为JVM启动时的启动类(含main方法的主类)

  

    其它都为被动引用:被动引用不会触发类的初始化操作(只会加载、链接),如仅申明一个类的引用、通过数组定义引用类等。

2、类的加载的完整生命过程

    加载、链接(验证、准备、解析)、初始化、使用、卸载

    

    1)、加载

        i)、java编译器加载类的二进制字节流文件(.class文件),如果该类有基类,向上一直加载到根基类(不管基类是否使用都会加载)。

        ii)、将二进制字节码加载到内存,解析成方法区对应的数据结构。

        iii)、在java逻辑堆中生成该类的java.lang.Class对象,作为方法区中该类的入口。

      类加载器:分默认加载器和用户自定义加载器

          Bootstrap ClassLoader:顶层加载器,由c++实现。负责JVM启动时加载JDK核心类库以及加载后面两个类加载器。

          Extension ClassLoader:继承自ClassLoader的类,负责加载{JAVA_HOME}/jre/lib/ext目录下的所有jar包。

          App ClassLoader:上面加载器的子对象,负责加载应用程序CLASSPATH目录下的class文件和jar包。

          Customer ClassLoader:用户继承自ClassLoader类的自定义加载器,用来处理特殊加载需求。如Tomcat等都有自己实现的加载器。

          类加载器采用双亲委托(自底向上查询)来避免重复加载类,而加载顺序却是自顶向下的。

    2)、链接

        i)、验证:字节码完整性、final类与方法、方法签名等的检查验证。

        ii)、准备:为静态变量分配存储空间(内存单元全置0,即基本类型为默认值,引用类型为null)。

        iii)、解析(这步是可选的):将常量池内的符号引用替换为直接引用。

      类的加载和链接只执行一次,故static成员也只加载一次,作为类所拥有、类的所有实例共享。

    3)、初始化

        包括类的初始化、对象的初始化。

          类的初始化:初始化静态字段(执行定义处的初始化动作)、执行静态初始化块。

          对象的初始化:

          如果需要创建对象,则会执行创建对象并初始化:

          i)、在堆上为创建的对象分配足够的存储空间,并将存储单元清零,即基本类型为默认值,引用类型为null。

          i)、如果有基类、递归初始化非静态成员变量(即执行变量定义处的初始化动作)、构造方法。

          ii)、最后才初始化本类非静态成员、构造方法。

    4)、使用

    5)、卸载

        对象的引用(栈中)在超出作用域后被系统立即回收;对象本身(堆中)被gc标记为垃圾,在gc下次执行垃圾处理时被回收。

  总结:一个类最先初始化static变量和static块;

     然后分配该类以及父类的成员变量的内存空间,赋初值,再调用构造方法;

     在父类与子类之间,总是优先创建、初始化父类。

     即:(静态变量、静态初始化块)–>(变量、初始化块)–> 构造器,其中基类总是优先于子类的。

参考:java中类的加载顺序介绍(ClassLoader)

JAVA类加载和初始化

Java系列笔记(1) - Java 类加载与初始化

时间: 2024-10-02 06:57:45

java类的加载与初始化总结的相关文章

Java类的加载 链接 初始化

原文地址 Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始化这三个步骤.这三个步骤中,对开发人员直接可见的是Java类的加载,通过使用Java类加载器(class loader)可以在运行时刻动态的加载一个Java类:而链接和初始化则是在使用Java类之前会发生的动作.本文会详细介绍Java类的加载.链接和初始化的

java类的加载以及初始化顺序 .

类的加载和初始化的了解对于我们对编程的理解有很大帮助,最近在看类的记载方面的问题.从网上查阅了若干文章,现总结如下: 我们通过一段代码来了解类加载和初始化的顺序: package com.classloader.demo; class Insect {  private int i = 9;  protected int j;  Insect() {    System.out.println("i = " + i + ", j = " + j);    j = 3

Java类的加载、链接和初始化

一.Java的类加载机制回顾与总结: 我们知道一个Java类要想运行,必须由jvm将其装载到内存中才能运行,装载的目的就是把Java字节代码转换成JVM中的java.lang.Class类的对象.这样Java就可以对该对象进行一系列操作,装载过程有两个比较重要的特征:层次组织结构和代理模式.层次组织结构指的是每个类加载器都有一个父类加载器,通过getParent()方法可以获取到.类加载器通过这种父亲-后代的方式组织在一起,形成树状层次结构.代理模式则指的是一个类加载器既可以自己完成Java类的

java 类的加载、连接和初始化

JVM和类 调用Java命令运行Java程序时,该命令将会启动一条Java虚拟机进程,不管该Java程序启动了多少条线程,创建了多少个变量,它们都处于该Java虚拟机进程里,共享该JVM进程的内存区.当系统出现以下几种情况时,JVM进程将被终止: 程序运行到最后正常结束: 程序运行到使用System.exit()或Runtime.getRuntime.exit()代码结束程序: 程序运行过程中遇到未捕获的异常或错误而结束: 程序所在的平台强制结束了JVM进程. 类的加载 当程序主动使用某个类时,

跟王老师学反射(二):Java类的加载、连接和初始化

跟王老师学反射(二):Java类的加载.连接和初始化 主讲教师:王少华   QQ群号:483773664 学习内容: 了解类的加载.连接和初始化 一.类的生命周期 当我们编写一个java的源文件后,经过编译会生成一个后缀名为class的文件,这种文件叫做字节码文件,只有这种字节码文件才能够在java虚拟机中运行,java类的生命周期就是指一个class文件从加载到卸载的全过程.一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段,当然也有在加载或者连接之后没有被初始化就直

java 类的加载,链接,初始化

本篇的话题,讨论Java类的加载.链接和初始化.Java字节代码的表现形式是字节数组(byte[]),而Java类在JVM中的表现形式是java.lang.Class类的对象.一个Java类从字节代码到能够在JVM中被使用,需要经过加载.链接和初始化这三个步骤.这三个步骤中,对开发人员直接可见的是Java类的加载,通过使用Java类加载器(class loader)可以在运行时刻动态的加载一个Java类:而链接和初始化则是在使用Java类之前会发生的动作.本文会详细介绍Java类的加载.链接和初

jvm系列(一):java类的加载机制

java类的加载机制 原文:http://www.cnblogs.com/ityouknow/p/5603287.html 1.什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口. 类加载器并不需要等到某个

【Java基础】Java类的加载和对象创建流程的详细分析

相信我们在面试Java的时候总会有一些公司要做笔试题目的,而Java类的加载和对象创建流程的知识点也是常见的题目之一.接下来通过实例详细的分析一下. 实例问题 实例代码 Parent类 1 package mytest.javaBase; 2 3 public class Parent { 4 int a = 10; 5 static int b = 11; 6 // 静态代码块 7 static { 8 System.out.println("Parent静态代码块:b=" + b)

JAVA类的加载顺序

JAVA类的加载顺序 JAVA中类的初始化规则是:先初始化static成员变量和static块,再初始化non-static成员变量和non-static块,最后初始化构造函数. 例1: package demo; /** * 此类主要介绍java类的加载顺序 * */ public class TestOrder { public static int k = 0; public static TestOrder t1 = new TestOrder("t1"); public st