`
geeksun
  • 浏览: 952983 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java类加载机制---类的初始化和卸载

阅读更多

类的初始化,包括生成对象的初始化和类的静态块的实例化。

 

初始化触发的时机: 类被直接引用(主动引用)的时候。

 

主动引用

主动引用的情形有:

1. 使用new关健字实例化对象

2. 使用类的静态变量

3. 使用类的静态方法

4. 使用反射机制调用上述操作

5. 程序入口 (调用main方法)

 

 

初始化顺序是:

静态块 ---> 非静态块 ---> 构造函数。

 

如果有超类,则初始化顺序是:

父类静态块--->子类静态块--->父类非静态块--->父类构造函数--->子类非静态块--->子类构造函数

 

 

Example:

public class ObjectInitialTest {

    public static void main(String[] args) {

        System.out.println("---Initialize new Class---");
        Father c = new Child();

        System.out.println("---Execute chlid class method---");
        Child.execute();
    }

}


class Child extends Father {

    static {
        System.out.println("Child static block");
    }

    {
        System.out.println("Child block");
    }

    public Child(){
        System.out.println("Child created");
    }

    public static void execute() {
        System.out.println("Child execute");
    }

}

class Father {

    static {
        System.out.println("Father static block");
    }

    {
        System.out.println("Father block");
    }

    public Father(){
        System.out.println("Father created");
    }

}

 

 执行Father c = new Child()输出为:

---Initialize new Class---
Father static block
Child static block
Father block
Father created
Child block
Child created

 

执行Child.execute()输出为:

---Execute chlid class method---
Father static block
Child static block
Child execute

 

执行 Father c = new Child();Child.execute();输出:

---Initialize new Class---
Father static block
Child static block
Father block
Father created
Child block
Child created
---Execute child class method---
Child execute

 

由上述结果可知,类的静态块,只初始化一次。

结论:

在类的初始化时,只会初始化类的静态块和静态赋值语句,也就是static修饰的代码块,没有static修饰的代码块在对象实例化时才执行。

 

被动引用

被动引用不会触发类的初始化。

被动引用的情形:

1.引用父类的静态字段,只会初始化父类,不会初始化子类。

2.引用类的常量,不会引起类的初始化。

 

类的卸载

在类使用完之后,满足下面的情形,会被卸载:

1. 该类在堆中的所有实例都已被回收,即在堆中不存在该类的实例对象。

2. 加载该类的classLoader已经被回收。

3. 该类对应的Class对象没有任何地方可以被引用,通过反射访问不到该Class对象。

 

如果类满足卸载条件,JVM就在GC的时候,对类进行卸载,即在方法区清除类的信息。

 

总结

Java的类对象基本上都是在jvm的堆区中创建,在创建对象之前,会触发类加载(加载、连接、初始化),当类初始化完成后,根据类信息在堆区中实例化类对象,初始化非静态变量、非静态代码以及默认构造方法,当对象使用完之后会在合适的时候被jvm垃圾收集器回收。

 

对象的生命周期只是类的生命周期中使用阶段的主动引用的一种情况(即实例化类对象)。而类的整个生命周期则要比对象的生命周期长的多。

 
分享到:
评论

相关推荐

    深入理解java类加载机制

    此外,我们还会探讨Java程序的类加载器和双亲委派机制,以及自定义类加载器和类卸载的实现原理和应用方法。 总的来说,本资源将为Java程序员提供全面的Java字节码和类加载原理和实践经验。通过学习本资源,开发人员将...

    详解JAVA类加载机制(推荐)

    我们这里主要介绍编译和类加载这两种机制。 一、源码编译 代码编译由JAVA源码编译器来完成。主要是将源码编译成字节码文件(class文件)。字节码文件格式主要分为两部分:常量池和方法字节码。 二、类加载 类的生命...

    JVM 面试题总结.md

    - 请你描述一下 Java 中的类加载机制? - 加载 - 验证 - 准备 - 解析 - 初始化 - 使用 - 卸载 - 在 JVM 中,对象是如何创建的? - 内存分配方式有哪些呢? - 请你说一下对象的内存布局? - 对象头 ...

    Java虚拟机类加载机制浅谈

     虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验、准备、解析和初始化,终会形成可以被虚拟机使用的Java类型,这是一个虚拟机的类加载机制。Java中的类是动态加载的,只有在运行期间使用到该类的...

    关于JVM的总结

    类被加载到虚拟机内存开始,到卸载出内存为止,生命周期包含: 加载,验证,准备,解析,初始化,使用,卸载 7个阶段,加载,验证,准备,初始化和卸载这5个顺序是确定的,解析阶段则不一定,他在某些情况下可以在...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--应用启动之检查版本更新及初始化 |--延时任务的工具类 |--异常之UncaughtExceptionHandler全局捕获处理 |--异步任务AsyncTask的用法 |--异步任务的自定义 |--快捷方式增删查 |--手势识别器GestureDetector的用法 ...

    新版Android开发教程.rar

    开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了 43 家。 移动手机联盟创始成员: Aplix 、 Ascender 、 Audience 、 Broadcom 、中国移动、 eBay 、 Esmertec 、谷歌、...

    《剑指offer》JVM面试题总结.pdf

    请你描述一下 Java 中的类加载机制? 加载 验证 准备 解析 初始化 使用 卸载 在 JVM 中,对象是如何创建的? 内存分配方式有哪些呢? 请你说一下对象的内存布局? 对象头 Header 实例数据 Instance Data 对齐 ...

    12.虚拟机的加载机制1

    1. 加载 2. 验证 【连接】 3. 准备 【连接】 4. 解析 【连接】 5. 初始化 6. 使 7. 卸载 1. 遇到new、getstatic、puts

    易语言程序免安装版下载

    重新创建并初始化()”方法。 8. 修改应用接口支持库,增强“取快捷方式目标”命令功能,可以获取目标、参数、启始位置、图标、运行方式、快捷键、备注等信息。 9. 修改扩展界面支持库三,解决高级选择夹会导致所在...

    Visual C++实践与提高-COM和COM+篇『PDF』

    10.2.2 标记控件为初始化/脚本安全 10.2.3 持续属性 10.3 在ActiveX控件中访问DOM对象 10.3.1 什么是DOM(文档对象模型) 10.3.2 在ActiveX控件中访问DOM——例程DOMSamp 10.3.3 测试DOMCtrl控件 10.4 活动服务器...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第二阶段44讲、被动引用和类加载过程的练习巩固训练题.mp4 │ 高并发编程第二阶段45讲、ClassLoader加载阶段发生的故事.mp4 │ 高并发编程第二阶段46讲、ClassLoader链接阶段(验证,准备,解析)...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第二阶段44讲、被动引用和类加载过程的练习巩固训练题.mp4 │ 高并发编程第二阶段45讲、ClassLoader加载阶段发生的故事.mp4 │ 高并发编程第二阶段46讲、ClassLoader链接阶段(验证,准备,解析)...

    TCP-IP技术大全

    IP网络中的名字和地址 29 4.1 IP寻址 29 4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 ...

    TCP/IP技术大全

    24.1.2 NetWare 5与Pure IP初始化 262 24.2 传统解决方案:NetWare 3.x到 NetWare 4.x的IP支持 263 24.2.1 IP隧道 264 24.2.2 IP中继 264 24.2.3 LAN WorkPlace 264 24.2.4 IPX-IP网关 265 24.2.5 NetWare/IP 265 ...

    TCPIP协议详解(4-1)

    IP网络中的名字和地址 29 4.1 IP寻址 29 4.1.1 二进制和十进制数 30 4.1.2 IPv4地址格式 30 4.2 子网的出现 34 4.2.1 分子网 35 4.2.2 可变长子网掩码(VLSM) 37 4.3 无类域前路由(CIDR) 38 ...

    RED HAT LINUX 6大全

    6.2 初始化进程和启动脚本 90 6.2.1 init和/etc/inittab 90 6.2.2 /etc/inittab和系统状态 92 6.3 linuxconf与管理服务 96 6.4 关闭Linux系统 98 6.4.1 shutdown 98 6.4.2 halt与reboot 99 6.5 当系统崩溃时 100 ...

    TCP/IP技术大全(中文PDF非扫描版)

    11.3.2 初始化更新 107 11.3.3 路由度量标准 107 11.4 小结 108 第12章 路由信息协议(RIP) 109 12.1 理解RFC1058 109 12.1.1 RIP报文格式 109 12.1.2 RIP路由表 111 12.2 操作机制 112 12.2.1 计算距离向量 113 ...

    TCP/IP教程TCP/IP基础

    11.3.2 初始化更新 107 11.3.3 路由度量标准 107 11.4 小结 108 第12章 路由信息协议(RIP) 109 12.1 理解RFC1058 109 12.1.1 RIP报文格式 109 12.1.2 RIP路由表 111 12.2 操作机制 112 12.2.1 计算距离向量 113 ...

Global site tag (gtag.js) - Google Analytics