分析这个程序的执行结果:
public class Singleton {
private static Singleton obj = new Singleton();
public static int counter1;
public static int counter2 = 0;
private Singleton(){
counter1++;
counter2++;
}
public static Singleton getInstance(){
return obj;
}
public static void main(String[] args) {
Singleton obj = Singleton.getInstance();
System.out.println("obj.counter1: " + obj.counter1);
System.out.println("obj.counter2: " + obj.counter2);
}
}
这个和Java初始化顺序有关,
由于你的第一句是
private static Singleton obj = new Singleton();
所以在初始化静态变量obj时中间插入了一个构造函数,造成了counter1和counter2最后的结果不一样。完整的时间链如下
1) JVM调用Singleton.Main,由于这是一个static method,JVM必须构造Singleton的所有static member(也就是说jvm必须先初始化static变量,之后才能执行静态方法Singleton.getInstance()),按照Java Specifiction的要求,指针被初始化为null,数值为0。到此为止 counter1=0,counter2=0
2)接下来,按照自上而下的顺序,完成所有static member的赋值操作。第一个赋值操作是(static)obj = new Singleton() ,JVM会调用Singleton的构造函数,完成counter1和counter2的赋值。到此为止 counter1=1,counter2=1
3)接着执行的是private static Singleton obj = new Singleton();的下一句(public static int)counter2 = 0;到此为止 counter1=1,counter2=0
你可以试试把private static Singleton obj = new Singleton();放到最后,则结果就都是1了。
分享到:
相关推荐
类加载不仅包括加载,还包括验证、准备、解析和初始化等阶段。验证阶段确保字节码的正确性,准备阶段为类的静态变量分配内存并初始化为默认值,解析阶段将符号引用转换为直接引用,初始化阶段执行类的初始化方法 `()...
在Java编程语言中,程序初始化的顺序是一个关键概念,它涉及到类加载、对象创建以及执行流程的安排。了解这些顺序对于编写高效、无错误的...在实际项目中,合理利用初始化顺序可以帮助我们优化资源加载,提高程序性能。
同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...
而当初始化顺序改变,先初始化静态变量再创建`singleton`实例时,`a`和`b`的值都变为1,这是因为静态变量的初始化发生在类加载后、类初始化前。 理解JVM的类加载机制对于优化程序性能、解决类加载问题以及深入学习...
类加载的过程包括三个主要步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)和初始化(Initialization)。其中,加载是查找并加载类的二进制数据;验证确保类的数据符合JVM...
### Java中类的初始化顺序详解 #### 一、概述 在Java编程语言中,类的初始化是一个非常重要的概念。类的初始化涉及到多个方面,包括静态成员变量、实例成员变量、静态初始化块、实例初始化块以及构造函数等。本文...
总之,Java代码的初始化顺序是类加载的必然过程,涉及到静态和实例初始化块、构造函数、成员变量初始化以及继承关系的影响。这个demo是学习和理解这些概念的重要工具,通过实际操作可以加深对Java内存管理和对象生命...
类的静态变量和静态代码块在类加载时只初始化一次,按照它们在源代码中的顺序执行。它们在内存中属于类级别的,所有类的实例共享同一份静态变量和静态代码块的拷贝。 总结来说,JVM类加载机制保证了Java程序的稳定...
在Java中,类的初始化顺序是面试中的经典问题之一,它涉及到继承、静态成员以及实例成员等多个方面。正确理解类的初始化顺序对于编写正确、高效的代码至关重要。 首先,需要了解Java类初始化的基本规则,即在类的...
其中,加载是读取.class文件,验证确保字节码安全,准备分配静态变量内存,解析绑定符号引用,初始化执行类的初始化方法。 4. **类的加载条件** 类的加载并非在程序启动时一次性完成,而是按需加载。只有当类被...
在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...
Java对象的初始化顺序是一个关键的编程概念,它涉及到类加载、静态初始化、实例初始化等多个步骤。下面我们将详细探讨这些步骤。 首先,当程序运行并创建一个新的对象时,JVM(Java虚拟机)会按照特定的顺序来初始...
Java类加载初始化的过程是Java编程语言中一个重要的概念,它决定了Java类的加载和初始化顺序。在Java中,类的加载是通过类加载器(ClassLoader)来实现的。类加载器会将类的字节码文件(.class)加载到Java虚拟机...
5. **初始化**:执行类的静态初始化代码块和初始化静态变量为它们的指定值,这是类加载的最后一步,确保了类在使用前完成初始化。 6. **使用和卸载**:类加载后,JVM会持续使用这些类,直到程序结束或者类不再被...
### 深入Java虚拟机加载初始化 #### Classloader的作用及意义 在深入了解Java虚拟机(JVM)的加载初始化之前,我们先明确一下`Classloader`...希望本文能够帮助您更好地掌握Java虚拟机的核心机制之一:类加载初始化。
综上所述,JVM的类加载器子系统是复杂且精细的,它涉及到了类的加载、验证、准备、解析和初始化等多个环节。而类加载器作为类加载过程中的关键组件,其设计使得Java应用程序能够灵活地加载和运行各种不同的类文件。...
类的加载和初始化顺序: - 类加载:JVM首次主动使用某个类时,会进行类加载,包括类的验证、准备和解析阶段。 - 类初始化:在类初始化阶段,静态属性的内存被分配,然后执行静态初始化块来初始化静态属性。这个过程...
当Java虚拟机(JVM)首次遇到某个类的实例或者静态变量,或者当类的静态方法被调用时,会触发类的加载和初始化。类的初始化主要涉及到以下几个步骤: 1. 类加载:JVM会通过类加载器将类的.class文件加载到内存中。 ...