类的初始化,包括生成对象的初始化和类的静态块的实例化。
初始化触发的时机: 类被直接引用(主动引用)的时候。
主动引用
主动引用的情形有:
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开发中,JVM(Java虚拟机)的类加载机制是至关重要的,因为它负责将类的字节码转换为运行时的实例。本专题"性能调优专题-jvm类加载机制-performance-jvmclassloader"深入探讨了如何通过理解并优化类加载过程来...
Java类的生命周期主要包括以下几个阶段:加载、验证、准备、解析、初始化、使用和卸载。其中,类的初始化时机尤为重要。根据Java规范,以下几种情况必须对类进行初始化: 1. **遇到特定字节码指令**: - 当遇到 `...
5. 初始化(Initialization):执行类的静态初始化块和静态变量的赋值操作。 6. 使用(Using):使用加载的类,例如创建对象、调用方法等。 7. 卸载(Unloading):垃圾回收器将无用的类卸载出 JVM,以释放资源。 ...
Java虚拟机(JVM)的类加载过程是Java程序运行的基础,它涉及到类加载器、类的生命周期和一系列复杂的步骤。在这个过程中,类加载器主要任务是根据类的全限定名加载二进制字节流并转化为`java.lang.Class`对象。整个...
7. **类的生命周期**:类从加载到卸载,经历加载、链接(包括验证、准备和解析)、初始化、使用和卸载五个阶段。其中,加载、验证和准备三个阶段通常一起进行,称为类的连接过程。 8. **动态加载**:Java允许通过...
总结,Java的类加载机制和双亲委派模型是JVM工作的重要组成部分,理解这些机制有助于优化程序性能,解决类冲突问题,并实现特定的类加载策略。自定义类加载器则提供了扩展JVM类加载功能的可能,使得开发者能够根据...
JAVA类加载机制是JAVA虚拟机(JVM)的一部分,它负责将.class文件加载到内存中,并对其进行校验、转换、解析和初始化,以形成可以被JVM直接使用的JAVA类型。下面将详细介绍JAVA类加载机制的相关知识。 一、什么是类...
Java动态类加载机制是Java平台一个非常重要的特性,它允许程序在运行时动态地加载类,增强了软件的灵活性和可扩展性。动态类加载对于理解和优化Java应用程序的性能、实现插件系统、以及处理复杂的模块化系统至关重要...
Java虚拟机JVM类加载初始...了解类加载机制对于优化性能、理解和解决类加载相关问题至关重要,特别是在分布式、模块化和热部署等场景下。理解这些细节可以帮助开发者更好地控制类的生命周期,提高程序的效率和稳定性。
类加载涉及到类加载器的选择和类的生命周期,而类的卸载则依赖于Java的垃圾收集器和引用关系的判断。在实际编程中,开发者可以通过自定义类加载器来实现特定的加载逻辑,同时需要注意合理管理类的生命周期,以达到...
总结,JVM 类加载机制是Java平台的核心特性之一,它确保了程序的稳定运行和动态扩展能力。理解类加载器的工作原理和双亲委派模型对于优化程序性能、解决类冲突以及构建复杂的模块化系统至关重要。在实际开发中,掌握...
初始化阶段是类加载机制的第五个阶段。在这个阶段,JVM 会执行类的静态初始化器,并对类的静态变量进行赋值。 6. 使用 使用阶段是类加载机制的第六个阶段。在这个阶段,类已经被加载、验证、准备、解析和初始化...
Java虚拟机(JVM)的类加载机制是Java运行时环境的重要组成部分,它负责将类的字节码文件从磁盘加载到内存中,并进行一系列处理以确保安全性和正确性。当我们通过`java`命令运行一个Java程序时,类加载器会开始工作...
在Java中,类加载过程分为加载、验证、准备、解析和初始化五个阶段。 首先,让我们了解Java中的默认类加载器体系: 1. **Bootstrap ClassLoader**:这是最基础的类加载器,由JVM自身实现,通常用于加载`<JAVA_HOME...
我们这里主要介绍编译和类加载这两种机制。 一、源码编译 代码编译由JAVA源码编译器来完成。主要是将源码编译成字节码文件(class文件)。字节码文件格式主要分为两部分:常量池和方法字节码。 二、类加载 类的生命...
实验将结合具体的Java程序实例,运用单例模式对静态变量和对象进行初始化,以此来加深对类加载机制的理解。 #### 实验环境设置 为了确保实验的顺利进行,需要搭建合适的硬件和软件环境。硬件方面,建议使用一台...
Java 类的生命周期分为五个主要阶段:加载、连接(包括验证、准备、解析三个子阶段)、初始化、使用和卸载。 1. **加载**:这一阶段的主要任务是通过类的全限定名(如`com.example.MyClass`)来获取该类的字节码流...
Java类加载机制是Java虚拟机(JVM)的一部分,它负责将类的二进制数据加载到内存中,并对其进行验证、准备、解析和初始化,以形成可以被JVM直接使用的Java类型。下面是Java类加载机制的实现流程及原理详解。 一、类...
掌握类加载机制和JDK调优命令,对于Java开发者来说是提升程序性能、进行故障排查和性能优化的基础。它不仅可以帮助开发者诊断和解决运行时问题,还可以在项目开发过程中,就对性能进行预测和预防,从而降低问题发生...
- Java的类加载机制遵循双亲委派模型,即当一个类加载器接收到加载类的请求时,它首先会将请求委托给父类加载器。只有当父类加载器无法找到对应的类时,子类加载器才会尝试加载。这种设计有助于避免类的重复加载,...