`

六、类初始化

阅读更多

类的初始化是类加载的最后一个阶段,到了初始化阶段,才开始真正执行类中的Java程序代码。虚拟机规范严格规定了有且只有四种情况立即对类进行初始化:

  • 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类还没有进行过初始化,则需要先触发其初始话。生成这四条指令最常见的Java代码场景是:使用new关键字实例化对象时、读取或设置一个类的静态字段(static)时(被static修饰又被final修饰的,已在编译期把结果放入常量池的静态字段除外)、以及调用一个类的静态方法时。

对于静态字段,只有直接定义这个字段的类才会被初始化

  • 使用java.lang.refect包的方法对类进行反射调用时,如果类还没有进行初始化,则需要先触发其初始化
  • 当初始化一个类时,发现父类还没有进行初始化,则需要先触发父类的初始化
  • 当虚拟机启动时,用户需要指定一个要执行的主类,虚拟机会先执行该主类。

虚拟机规定只有这四种情况才会触发类的初始化,称为对一个类进行主动引用,除此之外所有引用类的方式都不会触发其初始化,称为被动引用

 

常量在编译阶段会存入调用它的类的常量池中,本质上没有直接引用到定义该常量的类,因此不会触发定义常量的类的初始化。

 

最后看一下接口的初始化过程与类初始化过程的不同。

 

接口也有初始化过程,上面的代码中我们都是用静态语句块来输出初始化信息的,而在接口中不能使用“static{}”语句块,但编译器仍然会为接口生成类构造器,用于初始化接口中定义的成员变量(实际上是 static final 修饰的全局常量)。

 

二者在初始化时最主要的区别是:当一个类在初始化时,要求其父类全部已经初始化过了,但是一个接口在初始化时,并不要求其父接口全部都完成了初始化,只有在真正使用到父接口的时候(如引用接口中定义的常量),才会初始化该父接口。这点也与类初始化的情况很不同,调用类中的 static final 常量时并不会 触发该类的初始化,但是调用接口中的 static final 常量时便会触发该接口的初始化。

 

分享到:
评论

相关推荐

    深入java虚拟机(三)——类的生命周期(下)类的初始化1

    【深入Java虚拟机(三)——类的生命周期(下)类的初始化1】 类的生命周期在Java中是一个关键的概念,它涵盖了从加载到卸载的整个过程。在类的生命周期中,初始化阶段是非常重要的,因为它涉及到类的静态变量的赋值...

    WPF 对象初始化器_1 对象初始化器_1

    ### WPF 对象初始化器详解 #### 一、对象初始化器概述 对象初始化器是C# 3.0引入的一项新特性,它简化了对象创建的过程。在传统的面向对象编程中,创建对象后通常需要手动设置各个属性。这种方式不仅繁琐,而且...

    第二篇金蝶k3供应链系统初始化.pptx

    六、初始化核算参数设置 初始化核算参数设置是指设置系统的核算参数,如核算项目、会计科目、计量单位等。这些参数的设置将影响整个系统的业务处理和数据存储。 七、初始化系统参数设置 初始化系统参数设置是...

    初始化OpenGL

    该过程主要包括安装OpenSDK、配置OpenGL的包含文件和库文件、创建GLInit类来初始化OpenGL、实现OpenGL的初始化函数和渲染函数等。 一、安装OpenSDK 在开始使用OpenGL之前,需要安装OpenSDK。安装成功后,在程序...

    金蝶云k3cloud初始化上线七个步骤 第二步 业务初始化流程

    #### 六、业务初始化 业务初始化涉及多个模块的初始化设置,包括但不限于: - **库存管理**:初始化库存数据,确保系统能够正确反映当前的库存状况。 - **固定资产**:初始化固定资产信息,为后续的资产管理提供...

    Java中对象的初始化

    ### Java中对象的初始化 #### 一、Java对象初始化概述 在Java中,对象的初始化是一个重要的概念,它涉及到如何创建对象以及如何设置对象的状态。本文档主要介绍Java对象初始化的相关知识点,包括构造方法的使用、...

    GDI+初始化的方法

    GDI+初始化方法 GDI+(Graphics Device Interface Plus)是微软推出的图形编程接口,用于在Windows平台上进行图形编程。为了使用GDI+,需要进行初始化操作。本文将详细介绍GDI+的初始化方法。 一、添加头文件 在...

    C++编程思想--第4章 初始化与清除

    在C++编程中,初始化和清除是至关重要的概念,它们对于减少编程错误和提高程序安全性具有显著作用。在C语言中,程序员常常会忘记初始化或清除变量,这可能导致严重的后果,尤其是在使用库的struct时。C++通过引入...

    剖析MFC六大关键技术之初始化过程

    本文将深入剖析MFC的六大关键技术,包括初始化过程、运行时类型识别(RTTI)、动态创建、永久保存、消息映射以及消息传递。 **1. MFC程序的初始化过程** MFC程序的初始化过程是程序启动后首先执行的一系列操作,...

    Android 初始化语言脚本

    ### Android 初始化语言脚本详解 #### 一、概述 Android 初始化语言是一种特殊的脚本语言,主要用于定义设备启动过程中的各种初始化任务。它被用来管理系统的启动和服务,确保Android设备能够按照预设的方式启动并...

    Android Bluetooth初始化代码详解.pdf

    2. 在AdapterService类的实例化过程中,会进入classInitNative()方法来执行初始化操作。该方法的主要处理包括: a. 注册Java回调函数,用于在底层蓝牙模块打开后,能够通知上层Java代码,并发出蓝牙打开的广播。 b...

    Opengl在vs2010的初始化

    ### OpenGL在VS2010中的初始化详解 #### 一、概述 在计算机图形学领域,OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。它使用SGI标准定义的一系列调...

    K3系统初始化指南(WORD)

    ### K3系统初始化指南知识点详解 #### 一、概述 K3系统初始化是企业在使用金蝶K3 ERP软件时的一项重要工作,它涉及到系统的基本设置和初始数据的录入,为后续的实际业务处理打下坚实的基础。初始化过程可以分为两...

    Spring源码学习六:bean初始化1

    总结来说,Spring在初始化阶段通过`finishBeanFactoryInitialization()`方法进行了一系列的准备工作,包括设置转换服务、处理织入转换器、停用临时类加载器、冻结配置,以及预实例化单例Bean。在预实例化过程中,...

    用友u8软件账套初始化的设置.ppt

    设置期初余额是账套初始化的第六步骤。在这个步骤中,企业需要设置期初余额,包括资产类、负债类、所有者权益类等。这将有助于企业更好地进行账务处理和财务分析。 七、日常账务处理 日常账务处理是账套初始化的...

    金蝶K/3项目初始化方案,内部资料。

    ### 金蝶K/3项目初始化方案解析 #### 一、概述 本方案为金蝶K/3项目的初始化方案,旨在为企业提供一个清晰且全面的系统初始化指导,确保企业能够顺利地将现有业务数据导入金蝶K/3系统中,并进行有效管理。初始化...

    java数组初始化详解修正版.doc

    根据不同的初始化方式,Java 提供了三种主要的数组初始化方法:动态初始化、静态初始化以及隐式初始化。 #### 二、动态初始化 动态初始化是在创建数组时由系统自动为数组中的元素赋以默认值。默认值取决于元素的...

    Spring的IoC容器初始化源码解析

    ### Spring的IoC容器初始化源码解析 #### 一、Spring框架的核心——IoC容器 Spring框架是一个开源的轻量级Java开发框架,其核心功能是IoC(Inversion of Control,控制反转)容器和AOP(Aspect Oriented ...

    matlab初始化数组-MATLAB初始化对象数组中文教程下载

    在MATLAB编程中,初始化数组是一项基本操作,特别是对于对象数组来说,这个过程涉及到类构造函数的调用。本教程主要讲解如何在MATLAB中初始化对象数组,以及处理与构造函数相关的注意事项。 首先,MATLAB允许你在...

    linux系统的初始化流程

    ### Linux系统的初始化流程详解 #### 一、引言 Linux作为一种广泛使用的开源操作系统,其启动流程涉及复杂的硬件交互和软件管理机制。理解Linux系统的初始化流程不仅有助于深入掌握操作系统的内部工作原理,还能够...

Global site tag (gtag.js) - Google Analytics