一、概要:

类的生命周期从类的 加载、连接、初始化 开始,到类的 卸载结束;

二、几个阶段:

加载:查找并加载类的二进制数据。(把类的.class文件的二进制数据读入内存,存放在运行时数据区的方法区;类加载的最终结果是产生堆区中描述对应类的Class对象);

连接:包括验证、准备和解析三个子阶段;

验证:确保补加载类的正确性;

准备:为类的静态变量分配内存,并设定默认值;

解析:把类中的符号引用转换为直接引用;

初始化:给类中的静态变量赋予正确的初始值;

类的加载时机:并不需要等到某个类被主动使用时才加载,虚拟机会预测某个类将要被使用就加载它;

类的初始化时机:

a. 创建类(new、反射、克隆、反序列化)

b. 使用静态方法、非静态变量

c. Class.forName("ATest");  获取描述类的Class对象;

另:初始化子类,父类被先初始化。虚拟机的启动类,使用命令 java Sample(也算是创建类);

注:

使用能在编译期能得知的final static修饰的常量,不会导致类的初始化;

public static final int a = 2*3;//编译时常量,不会导致类初始化;

public static final int a b = (int)(Math.random()*10)/10+1; // 不是编译时常量,会初始化;

只有当程序访问的静态变量或静态方法的确在当前类或接口中定义时,才可以看作是对类或接口的主动使用;(如用子类引用调用父类静态方法或变量,只会初始化父类)

调用ClassLoader.loadClass()方法加载一个类时,只会加载,但不会初始化;

子类父类初始化过程:

先对这个类进行加载和连接-> 如果有直接父类,先加载连接初始化这个父类->重复以上步骤直到所有父类初始化,初始化当前类;

(先加载连接当前类,再加载连接初始化父类,再初始化当前类)

classBase {static{

System.out.println("init Base");

}

}class Sub extendsBase {static{

System.out.println("init Sub");

}

}public class ATest extendsSub {static{

System.out.println("init ATest");

}public static voidmain(String args[]) {

System.out.println("main methos");

}

}

结果:

init Base

init Sub

init ATest

main methos

View Code

三、类加载器

除了Java虚拟机自带的根类加载器以外,其余的类加载器有且只有一个父加载器;

Java虚拟机自带以下几种加载器:

根(Bootstrap)类加载器:没有父类加载器。负责加载虚拟机核心类,sun.boot.class.path路径下类库,java.lang.*; 实现依赖于底层操作系统,没有继承java.lang.ClassLoader;

扩展(Extension)类加载器:父加载器为根加载器;加载java.ext.dirs下的类库 和 JDK目录下jre/lib/ext目录下类库;继承于java.lang.ClassLoader;

系统(System)类加载器:也称应用类加载器,父加载器为扩展类加载器;加载classpath路径下指定的类库;继承于java.lang.ClassLoader,也是自定义加载器的默认父类;

父亲委托机制:

类加载过程中,会先从最顶层加载器(一般是根加载器)开始往下,先判断父类加载器能不能加载,能加载则往下传递返回加载的类;不能加载则继续往下判断,如果都不能加载,则会抛出ClassNotFoundException异常;

加载器之间的父子关系实际上是指加载器对象之间的包装关系,而不是类之间的继承关系;

命名空间:

命名空间由该加载器及所有父加载器所加载的类组成;

唯一性:在同一个命名空间中,不会出现类的完整名字(包名+类名)相同的两个类;

同一命名空间有以下关系:

同一命名空间的类是相互可见的;(可见是指可以直接使用其类名,不可见的类之间可以通过反射来获取类信息);

子加载器的命名空间所含所有父加载器的命名空间,所有子类加载器的类能看见父加载器的类;但父加载器不能看见子加载器的类;

运行时包:

包名相同,且属于同一个类加载器;

同一运行时包的类才能包可见;如用户自己定义了一个java.lang.Spy,并由自己定义的类加载器加载,由于java.lang.Spy和核心类库java.lang.*由不同的类加载器加载,它们不在同一运行时包,Spy不能访问java.lang.*下的包可见类;

用户自定义类加载器:

扩展java.lang.ClassLoader类,然后覆盖它的findClass(String name)方法;

可通过 this.getClass().getClassLoader()获取类对应的加载器

类的卸载:(清除对应类的Class对象 和 类的二进制数据结构)

由Java虚拟自带的三个类加载器加载的类不能卸载;(虚拟机会始终引用这3个类加载器,类加载器中有一个集合,又会一直引用其加载的类的Class对象)

用户自定义的类加载器加载的类可以被卸载;

整理自孙卫琴《Java面象对象编程》

java 类加载生命周期_Java类的加载与生命周期相关推荐

  1. java的连接 初始化_java类从加载、连接到初始化过程详解

    Java代码在编译后会转化成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化成汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令. 类加载 ...

  2. java类加载器顺序_java中类的加载顺序介绍(ClassLoader)

    1.ClassNotFoundExcetpion 我们在开发中,经常可以遇见java.lang.ClassNotFoundExcetpion这个异常,今天我就来总结一下这个问题.对于这个异常,它实质涉 ...

  3. java类验证和装载顺序_Java类的加载机制和双亲委派模型

    Java类的加载机制和双亲委派模型 1类的加载机制 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括了:加载(Loading).验证(Verification).准备(Prepar ...

  4. java类 连接时机_java类的加载时机

    类加载 它直接表现出来的代码应该是 ClassLoader.getSystemClassLoader().loadClass("com.my.test.AbcClass").所以具 ...

  5. java初始化加载类_Java 类的加载和初始化

    直接从书上抄来的,自己写一遍加深印象 类的加载 加载就是通过指定的类全限定名,获取此类的二进制字节流(可以是clazz文件或者直接内存读取或者远程网络,jar包等),然后将此二进制字节流转化为方法区的 ...

  6. Java常见面试题:类的加载过程

    程序员看似光鲜的就业前景面前,逃不过的是层层的面试,想要进前沿的大公司没有个五六七八面,是不可能滴!而找工作的首个关卡就是笔试,想要获得高薪工作的小伙伴,先刷一波面试题吧! 今天给大家分享的面试题是- ...

  7. java类加载过程_java类的加载过程

    在这本书里面,在讲到类初始化的五种情况时,提及了一个比较有趣的事情.先来看看下面的代码 public class SubClass { static{ System.err.println(" ...

  8. java类的加载顺序题目_Java 类的加载顺序(题)

    引例 public class A extends B { public int a = 100; public A() { super(); System.out.println(a); a = 2 ...

  9. java 类 加载 初始化_java类的加载与初始化

    https://blog.csdn.net/u013349237/article/details/71076617 1在命令行启动虚拟机jvm进行加载, 2用class.forname()方法进行动态 ...

最新文章

  1. 当文员学计算机二级,二本学生毕业后在干什么?多半做3种工作,过来人深有同感...
  2. Java客户端操作HBase:插入数据(逐条插入与批量插入)代码示例
  3. C++中 auto自动变量,命名空间,using作用以及作用域
  4. 批量解锁源代码管理器的文件命
  5. 恒生证券期货行业用户维稳工作指引(一)
  6. linux编译动态库之fPIC
  7. vue项目报错,解决Module build failed: Error: Cannot find module ‘node-sass‘ 问题
  8. 程序员和美工是否可共存?
  9. 6月第二周国内域名解析商Top10:万网份额突破21%
  10. Notepad++官网下载
  11. 简化“复杂”的层级管理,实现团队作战式的目标协同
  12. 迪文屏幕ttl转232选择
  13. 郭敏:高速公路“过山车”式限速乱象的根本并非技术问题,而是管理协作机制缺位...
  14. USB-C PD接口DRP芯片功能介绍
  15. 全国青少年编程等级考试scratch二级真题2021年9月(含题库答题软件账号)
  16. C++程序方法 --- 病毒感染检测
  17. opengl 画椭圆_漫谈椭圆的几何性质(之一)
  18. 第一行代码-ListViewDemo(2)-读书笔记
  19. Java指定时间执行任务
  20. 2021东南亚新兴平台Lazada开店入驻最全流程Lazada新店运营思路分享

热门文章

  1. mac上python3安装HTMLTestRunner
  2. 面试-重写基础功能函数
  3. python opencv3 检测人
  4. 水题 UVA 1586 - Ancient Cipher化学式分子量计算
  5. 10天学安卓-第二天
  6. C语言中printf(built: %s %s,__TIME__,__DATE__);方便调试
  7. SharePoint 2010中的内容类型集线器 - 内容类型发布与订阅
  8. 在存储过程中使用系统存储过程sp_Excute的注意事项
  9. 计算机视觉——图像预处理及边缘检测
  10. Leetcode--134. 加油站