加载一个类时,其内部类是否同时被加载?下面我们做一个实验来看一下。
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保证了多线程并发访问的正确性。
分享到:
相关推荐
例如,在单例模式中如何确保只有一个实例被创建,并且在不违反单例原则的情况下进行初始化。 #### 四、大瓶子套小瓶子还是小瓶子套大瓶子? - 这个问题引申出聚合和组合的概念。聚合表示一个对象包含另一个对象...
这种模式将一个复杂的构建过程分解为一系列简单的步骤,使得构造过程和表示细节可以独立变化。在本文中,我们将深入探讨建造者模式在实际开发中的应用及其可能遇到的问题和引申话题。 一、建造者模式的基本结构与...
继承允许一个类(子类)从另一个类(父类)继承属性和行为,从而实现代码重用。多态则允许子类根据需要覆盖或扩展父类的行为,增强了程序的灵活性。 设计模式举例通常会涵盖工厂模式、单例模式、观察者模式等。工厂...
- **定义**:单例模式确保一个类只有一个实例,并提供一个全局访问点。 - **优点**:保证系统内存中该类只存在一个实例,节省资源。 - **缺点**:可能降低系统的可扩展性和可维护性。 **建造者模式**: - **定义**...
- **单例模式(Singleton Pattern)**:确保一个类只有一个实例,并提供一个全局访问点。 - **建造者模式(Builder Pattern)**:将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。 - **...
在古汉语中,词义的引申主要通过三种方式完成:连锁式引申、辐射式引申和综合式引申。 连锁式引申,顾名思义,如同链条一般连接着一系列的意义,每一步的引申都是基于上一步的意义,通过逐步的抽象和扩大,形成了一...
根据文档中的对话,我们可以提炼出以下几个关键知识点: ### 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`并不直接持有对象的内容,而是持有到达对象的路径。 在实际编程中,理解引用和句柄的区别很重要,因为它们...
一种带有轮子的图书及其引申的文化用品的设计,正是一种创新的尝试,它将图书的移动性与文化内涵结合起来,旨在为读者提供更加便捷和丰富的文化体验。 图书馆服务的现代化趋势要求图书能够更加灵活地适应不同的阅读...
而“网络游戏-一种数据仓库中父子模型引申为网络模型的应用方法”这一主题,旨在探讨如何将数据仓库中的父子模型应用于网络游戏的数据管理,以优化网络模型的构建与分析。 首先,我们来理解父子模型。在数据仓库...
产品设计是一个涵盖广泛领域,融合了用户需求理解、市场分析、技术创新等多方面能力的综合性工作。数学,作为逻辑和理性的象征,为产品经理提供了强大的思维方式和工具。数学思想不仅在科学研究中起着基础作用,同样...