java 类加载生命周期_Java类的加载与生命周期

一、概要:

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

二、几个阶段:

加载:查找并加载类的二进制数据。(把类的.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()方法加载一个类时,只会加载,但不会初始化;

子类父类初始化过程:

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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对象)

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

99327bf56cbc24f2b523dfaeb0fb97ee.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500641.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tooooooooooooold

看到一篇文章: http://blog.csdn.net/atixujie/archive/2011/04/06/6305371.aspx 推荐软件工程的书籍, 我看了一眼, 觉得特别陌生, 就找了一下原文, 原文在: http://www.cs.cmu.edu/afs/cs.cmu.edu/user/shaw/www/Edparts/sebook.htm 在原始的网页上有一段小字: It was l…

java 配置嵌套事务_Spring 事务嵌套的配置

问题在使用Spring管理Service层事务时,会遇到service方法事务嵌套的问题。默认情况下,service方法有自己独立的事务,如果一个复杂的service方法中,调用了多个事务操作,中间抛出异常时,往往不会发生事务回滚…

软件工程 动物世界

在一个神奇的国度里生活着许多动物, 其中有猪, 鸡, 和鹦鹉。 它们每天搞头脑风暴, 琢磨如何创业, 最后鹦鹉提议它们合伙开一个早餐店: 具体分工如下: 猪: 提供猪肉, 做熏猪肉 (bacon) 鸡: 提供鸡蛋, 做煎蛋 鹦鹉: 提供咨询, 它会每天阅读大量博客, 给其他团队成员提供建议, 例…

java filterinputstream_java.io.FilterInputStream.close()

全屏java.io.FilterInputStream.close()方法关闭此输入流并释放与该流关联的所有系统资源。声明以下是public void close() 方法的声明:public void close()参数NA返回值该方法不返回任何值。异常IOException -- 如果发生I/ O错误。例子下面的例子显示了public void…

软件工程 敏捷的酒后问答

来源:《构建之法》 王屋村移山公司的程序员果冻最近请假参加了一系列敏捷的培训, 有好事者传言他和 “a-girl”勾搭上了, 其他年轻同事有点坐不住了, 也表示要参加此类活动。 几天后, 果冻回到公司, 给所有人发了一枚写有 “Agile” 的胸章。 他纠正大家的发音, 这个…

创新, FMA SMA 世界第一台VCD机的故事

FMA & SMA http://en.wikipedia.org/wiki/First-mover_advantage Second-mover advantage -------------------- 世界第一台VCD机 提到VCD机,必然要说到它的创始人姜万勐。世界上第一台VCD机产自中国,时间是1993年9月,由姜万勐研制。 姜…

java 打印命令_Java 普通命令行程序main关掉 DEBUG 打印

最近在写一个简单的java命令行程序,执行代码时,代码窗口出现了烦人的debug日志。分析了一下,出现这种问题的原因是因为,maven项目的依赖包中传递依赖了一些日志框架,导致会出现日志内容的打印。查看了一下,…

现代软件工程 作业 文本文件中英语单词的频率

这是《构建之法》现代软件工程课的个人项目作业 个人项目 Individual Project: 一个人独立完成.时间: 可以考虑在第一周就给同学们这个项目; 也可以考虑分为两部分, 个人做第一部分, 然后两人结对,选两个人中较好的程序,再继续开…

java 继承变量_用java中的变量继承

任何人都可以澄清我.这里实例方法被覆盖但变量不被覆盖.输出为:B 10class A{int i10;public void name(){System.out.println("A");}}class B extends A{int i20;public void name(){System.out.println("B");}}public class HelloWorld {publi…

现代软件工程 怎么教好课 (读书笔记)

0. 教师教学有培训和参考书么? 我从来没想到过我会在大学里教书, 而且还教了好几年, 好几个学校。 当时接到任务的时候, 我把它当作实习生培训和新员工培训的”学院版”, 还是继续强调实践, 反馈, 合作, 就这么开讲了。 在微软公司, 做大部分和人相关的事情, 都得先有一个培训…

php oci 11g.dll下载,Oracle oci.dll

Oracle oci.dll是在32位PLSQL Developer软件访问Oracle 11g 64位数据库必须的系统dll文件,用于支持连接访问数据,如果系统出现相关dll文件缺失,就需重新下载,有需要的朋友快来巴士下载网下载吧!Oracle 11g oci.dll文件…

java url authority,Java如何解析url,包括自定义schema的url

比如我要解析下面这个url:myscheme://adminblog.nihao001.com:8080/index.jsp?usernameasdf&password123456&msg%e4%bd%a0%e5%a5%bd#editor只要使用URI这个类就可以解析了。上代码:import java.net.URI;import java.net.URISyntaxException;pub…

软件工程 案例分析作业

现代软件工程 构建之法 作业https://bbs.csdn.net/forums/SoftwareEngineering?typeId1723 软件工程作业 案例分析 (建议作为个人或结对作业) 很多同学有疑惑: 软件工程课是否就是枯燥的理论课? 或者是几个牛人拼命写代码,其他人抱大腿的…

现代软件工程讲义 目录

软件工程牵涉的范围很广, 同时也是一般院校的同学反映比较乏味的课程。 但是软件工程的技术对于投身IT 产业的学生来说是非常重要的。 经过几年的探索, 我总结了在16周的时间内让同学们通过 “做中学 (Learning By Doing)” 掌握实用的软件工程技术的教学计划。 这套讲义在下面…

php的数据模型包括,数据库中模型的分类有哪些

数据库中模型的分类:1、概念数据模型,面向用户、面向现实世界的数据模型,描述一个单位的概念化结构;2、逻辑数据模型,可以通过实体和关系勾勒出企业的数据蓝图;3、物理数据模型,具有以实物或画图…

现代软件工程 团队作业 - 软件分析和用户需求调查 (2013 - 2014)

【现代软件工程 的讲义】 医学院的学生, 要练习解剖人体; MBA 的学生, 要剖析某公司的成败; 法律系的学生,要阅读和分析大量案例...... 软件行业的从业人员, 不管是项目经理, 开发或测试人员, 都要学会解剖分析软件, 我们就来试试看。 要求:…

php 去年年初和年底时间,PHP 日期与时间

获取时间1.使用 date 函数格式化一个本地时间。//输出当前时间echo date(‘Y-m-d H:i:s‘);2.使用 getdate 函数获取时间戳的日期时间信息。//打印出详细的信息var_dump(getdate(time()));时间戳1.使用 time 函数获取当前时间戳//输出当前的时间戳echo time()2.使用 mktime 函数…

Arrays.sort() and 吾欲仁则斯仁至矣

有不少人在争论 Java 对学生有益还是有害(不少网站上的评论有断章取义的嫌疑,不值得多看,建议看这个中文链接)(英文链接)。事实上,这个问题事实上不是最近才提出来,大约6~7 年前&…

一目了然

这是啥? a) 某星系的结构图 b) 博客堂的社会关系网络 c) 某传销网络 d) 某合法视频直播网络,可以看到CCTV-1 全部节目,包括春晚,有时还有体育节目。 最近在帮助一个项目的测试工作,这个项目需要通过一些数据及日志重现…

php 万分之一几率,那万分之一的概率啊……

【今日】不要心存侥幸心理,那万分之一的概率啊……也许就是发生在自己身上。【正文】1老公抱着暖暖,大踏步的向前走去,兴奋的说:“我刚在群里问了一下,还没人回复,你说不会两家店全部装修吧?这万分之一的概…