`

类初始化缘起

阅读更多
//: typeinfo/ClassInitialization.java
import java.util.*;

class Initable {
	static final int staticFinal = 47;
	static final int staticFinal2 = ClassInitialization.rand.nextInt(1000);
	static {
		System.out.println("Initializing Initable");
	}
}

class Initable2 {
	static int staticNonFinal = 147;
	static {
		System.out.println("Initializing Initable2");
	}
}

class Initable3 {
	static int staticNonFinal = 74;
	static {
		System.out.println("Initializing Initable3");
	}
}

public class ClassInitialization {
	public static Random rand = new Random(47);

	public static void main(String[] args) throws Exception {
		Class initable = Initable.class;
		System.out.println("After creating Initable ref");
		// Does not trigger initialization:
		System.out.println(Initable.staticFinal);
		// Does trigger initialization:
		System.out.println(Initable.staticFinal2);
		// Does trigger initialization:
		System.out.println(Initable2.staticNonFinal);
		Class initable3 = Class.forName("Initable3");
		System.out.println("After creating Initable3 ref");
		System.out.println(Initable3.staticNonFinal);
	}
}

 

可以看到,获得一个对class literal的引用不会导致类初始化,一般而言,引用static final的“编译时”变量也不会引起类初始化

 

Effectively, initialization is "as lazy as possible." From the creation of the initable reference, you can see that just using the .class syntax to get a reference to the class doesn’t cause initialization. However, Class.forName( ) initializes the class immediately in order to produce the Class reference, as you can see in the creation of initable3.
If a static final value is a "compile-time constant," such as Initable.staticFinal, that value can be read without causing the Initable class to be initialized. Making a field static and final, however, does not guarantee this behavior: accessing Initable.staticFinal2 forces class initialization because it cannot be a compile-time constant.
If a static field is not final, accessing it always requires linking (to allocate storage for the field) and initialization (to initialize that storage) before it can be read, as you can see in the access to Initable2.staticNonFinal.

分享到:
评论

相关推荐

    聖殿祭司的ASP.NET 3.5專家技術手冊II新功能篇--使用C# 试读目录

    - **集合初始化设定**:类似于对象初始化,集合初始化提供了一种简洁的方式来创建并初始化集合对象。 - **匿名类型**:介绍了如何使用匿名类型来存储临时数据,而无需显式声明类型。 - **Lambda Expressions**:通过...

    hibernate-release-5.0.12.Final.rar

    初始化时,开发者需要创建SessionFactory,它是线程安全的,负责创建Session实例。 4. **实体管理** Hibernate通过XML或注解方式实现Java类到数据库表的映射,实体类是这种映射的核心。例如,一个`User`类可以通过...

    Nginx开发从入门到精通

    - **模块初始化**:在配置解析完成后,Nginx会初始化所有加载的模块。 - **热代码部署**:Nginx支持在不中断服务的情况下更新配置文件和重新加载模块。 ##### Nginx的请求处理阶段 - **接收请求流程**:当客户端...

    EDK II Documentation

    通过学习这些文档,开发者能够熟练地运用EDK II工具链来创建、调试和优化UEFI固件,从而实现更高效、更安全的硬件初始化和操作系统启动。这些规范不仅适用于UEFI固件开发,也对那些希望深入理解计算机启动过程、BIOS...

    Hadoop权威指南 第二版(中文版)

     作业的初始化  任务的分配  任务的执行  进度和状态的更新  作业的完成  失败  任务失败  tasktracker失败  jobtracker失败  作业的调度  Fair Scheduler  Capacity Scheduler  shuffle和排序  map端...

    3-5+AutoML与推荐系统.pdf

    **PART ONE 缘起** 构建一个预测模型是一个复杂的过程,涉及多个步骤,包括目标定义、数据收集、特征工程、算法选择、模型优化以及最终的模型应用。数据科学家的角色就是在这个过程中寻找最佳的方法来解决问题。...

    商业计划书PPT模板精选 (71).pptx

    - **项目起源**:项目缘起部分可以详细描述项目的初始想法是如何产生的,以及推动项目发展的关键因素是什么。 - **具体描述**:模板中提供了几个示例性的文字描述,用于说明项目起源的具体内容。 ### 5. 项目内容 ...

    Flutter 实战(305页).pdf

    - **项目初始化**:使用命令行工具创建新项目。 - **布局构建**:利用Flutter提供的基础组件如Text、Container等构建用户界面。 - **状态管理**:介绍如何管理和更新应用的状态。 - **调试技巧**:使用Flutter ...

    lzw的编码分析及实现原理

    1. 初始化码书,通常包含ASCII码表或特定字符集的所有单字符。 2. 读取第一个输入字符,并将其设置为当前字符串`STRING`。 3. 进入循环,直到没有输入字符为止。 4. 读取下一个输入字符`CHARACTER`。 5. 如果`STRING...

    大学生创业计划书(17)三份资料.doc

    - **创意缘起**: 该公司基于人机智能技术设计了一款模块化的可穿戴外骨骼上肢机器人系统。这款机器人能够通过电机驱动,配合柔索传动储能机构实现肩关节的内旋/外旋、屈曲/伸展,以及肘关节的屈曲/伸展等功能。 - **...

    深度探讨 PHP 之性能.doc

    - **内存池生命周期**:PHP 在内存分配和回收过程中采用了一次性初始化申请加上动态扩容的方式,并结合了内存标识回收机制。每当一个 HTTP 请求结束时,PHP 会直接重置内存池,而不是释放所有内存。 - **大小内存...

    数据库秒级平滑扩容架构方案

    - 重启服务或通过配置中心发送信号来重新加载配置,重新初始化数据库连接池。这样一来,数据库实例的数量就从2个扩展到了4个,整个过程可以在秒级内完成,而且不会影响服务的正常运行。 3. **收尾工作,数据收缩**...

    非线性模型及其解法 最小二乘法

    1. **初始化**:选择一个初始估计值 \( X_0 \)。 2. **线性化**:在线性化后,我们得到一个线性模型。 3. **求解**:利用线性模型求解最小二乘问题,得到新的估计值 \( X_1 \)。 4. **更新**:重复上述步骤直到收敛...

    西门子战略采购策略.docx

    西门子在采购时考虑产品或服务的全生命周期成本,包括初始购买成本、运营维护成本、废弃处理成本等,从而做出更为明智的采购决策。 2.2.2 基于事实的谈判 通过收集和分析数据,西门子能够进行有依据的谈判,避免因...

    在Python的Django框架中simple-todo工具的简单使用

    使用Django的命令行工具来初始化一个新的项目和应用: ```bash django-admin.py startproject simple_todo_site cd simple_todo_site/ python manage.py startapp simpletodo ``` 2. **编辑配置文件** 需要...

    872【118页PPT】华为铁三角工作法详解(精华版).pptx

    - **缘起**:铁三角工作法是华为在面对日益激烈的市场竞争时,为提高客户满意度和内部运作效率而提出的一种组织架构创新。其核心思想是通过紧密协作的团队合作来快速响应客户需求。 - **发展历程**: - **2006年*...

    scrapy1.5-chinese-document-master.zip

    了解这些命令将帮助用户快速初始化并管理Scrapy项目。 2. **《2-Scrapy Tutorial.md.txt》**:这是Scrapy的入门教程,详细解释了如何创建第一个Scrapy爬虫项目,包括设置项目结构、编写爬虫文件、定义爬虫规则等,...

    Python一切从游戏开始

    #### 缘起:数学游戏与Python编程的结合 故事开始于一个简单的数学游戏:给定数字56789,将其放入表达式`[][][]*[][]`中,使得计算结果最大。这个问题虽然简单,但却引出了许多有趣的编程思考。 **初版解决方案**...

Global site tag (gtag.js) - Google Analytics