加载一个类时,其内部类是否同时被加载?下面我们做一个实验来看一下。
public class Outer {
static {
System.out.println("load outer class...");
}
//静态内部类
static class StaticInner {
static {
System.out.println("load static inner class...");
}
static void staticInnerMethod() {
System.out.println("static inner method...");
}
}
public static void main(String[] args) {
Outer outer = new Outer(); //此刻其内部类是否也会被加载?
System.out.println("===========分割线===========");
Outer.StaticInner.staticInnerMethod(); //调用内部类的静态方法
}
}
运行结果:
load outer class...
==========分割线==========
load static inner class...
static inner method...
调用构造方法时,外部类Outer被加载,但这时其静态内部类StaticInner却未被加载。直到调用该内部类的静态方法(在分割线以下),StaticInner才被加载。可以做类似的实验验证非静态内部类的情况。
结论:加载一个类时,其内部类不会同时被加载。一个类被加载,当且仅当其某个静态成员(静态域、构造器、静态方法等)被调用时发生。
根据内部类不会在其外部类被加载的同时被加载的事实,我们可以引申出单例模式的一种实现方式:
public class Singleton {
private Singleton() {}
static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
该实现方式比较简单,而且既实现了由前述事实所保证的惰性初始化(Lazy-Initialazation),又由JVM保证了多线程并发访问的正确性。
分享到:
相关推荐
这种模式将一个复杂的构建过程分解为一系列简单的步骤,使得构造过程和表示细节可以独立变化。在本文中,我们将深入探讨建造者模式在实际开发中的应用及其可能遇到的问题和引申话题。 一、建造者模式的基本结构与...
- **定义**:单例模式确保一个类只有一个实例,并提供一个全局访问点。 - **优点**:保证系统内存中该类只存在一个实例,节省资源。 - **缺点**:可能降低系统的可扩展性和可维护性。 **建造者模式**: - **定义**...
模式分类是机器学习和计算机视觉中的一个重要分支,它的目标是根据预先定义的类别对输入数据进行分类。在实际应用中,如图像识别、语音识别、文本分类等,模式分类扮演着至关重要的角色。陈松灿教授作为该领域的权威...
根据文档中的对话,我们可以提炼出以下几个关键知识点: ### 1. 快速发展模式的特点 - **快速成长**:恒大的发展模式强调速度,追求快速扩大规模和市场份额。 - **野蛮增长**:在初始阶段,企业可能会采取一些非...
恒大发展模式是中国房地产行业中的一种独特策略,它以快速开发、大规模扩张和高周转率为特点。恒大集团通过快速拿地、快速建设、快速销售的方式,在短时间内实现了巨大的市场份额增长,成为了中国乃至全球知名的房...
在古汉语中,词义的引申是一种词汇发展的重要方式,通过不同的引申方式,一个词的原始含义得以拓展,形成了丰富的词汇系统。本文主要探讨了三种主要的词义引申方式:连锁式引申、辐射式引申和综合式引申。 1. 连锁...
"布林带引申出的指标:Bolling b%" 是布林带的一种变形应用,它可能是基于布林带宽度(即上下轨之间的距离)计算的一个百分比指标。布林带宽度的变化可以反映市场的波动性,当宽度收窄时,意味着波动性降低,市场...
扫描线算法是计算机图形学中的一种常用算法,用于实现多边形的扫描线填充。下面是JAVA实现扫描线算法的知识点总结: 1. 扫描线算法的基本概念: 扫描线算法是从Ymin开始扫描,然后构建出NET,之后根据NET建立AET。...
15_信息系统框架集成第三方产品案例_框架实现第一个socket类厂商实现 16_信息系统框架集成第三方产品案例_第二个socket类厂商实现 17_信息系统框架集成第三方产品案例_加解密抽象类和加解密厂商类实现 18_信息系统...
【开源的另一种途径——咖啡馆经营实务】 在探讨开源与咖啡馆经营的结合时,我们首先需要理解"开源"的概念。开源通常指的是软件领域中开放源代码的做法,允许用户访问、修改和分发代码。然而,在这个场景下,我们...
springboot本文研究了垃圾分类网站的设计与实现,在文章开端首先对个研究背景、研究现状和研究内容作了简单的介绍,然后通过系统分析,引申出本系统研究的主要内容。 通过对Java语言和MYSQL数据库的简介,从硬件和...
**Python-OctaveConv针对DropanOctave的一个MXNet实现** 在深度学习领域,模型的效率和性能一直是研究的重点。为了提升模型计算速度并降低内存消耗,研究人员不断探索新的架构和方法。其中,“Drop an Octave”是一...
当需要管理多个按钮时,可能需要为每个按钮创建一个ivar来保存其状态,例如选中、未选中等。但是,过度使用ivar可能导致内存泄漏或引用计数错误,因此应遵循以下最佳实践: 1. 使用strong或weak属性:对于非ARC环境...
`时,`new`关键字在堆内存中创建了一个A类的实例,并返回其内存地址,这个地址被赋值给句柄`a`。因此,`a`并不直接持有对象的内容,而是持有到达对象的路径。 在实际编程中,理解引用和句柄的区别很重要,因为它们...
而“网络游戏-一种数据仓库中父子模型引申为网络模型的应用方法”这一主题,旨在探讨如何将数据仓库中的父子模型应用于网络游戏的数据管理,以优化网络模型的构建与分析。 首先,我们来理解父子模型。在数据仓库...
产品设计是一个涵盖广泛领域,融合了用户需求理解、市场分析、技术创新等多方面能力的综合性工作。数学,作为逻辑和理性的象征,为产品经理提供了强大的思维方式和工具。数学思想不仅在科学研究中起着基础作用,同样...