`

静态变量的初始化顺序与问题

 
阅读更多

        先看一个代码,猜猜看会输出什么:

public  class Elvis{
	public static final Elvis INSTANCE=new Elvis();
	private static final int CURRENT_YEAR=Calendar.getInstance().get(Calendar.YEAR);
	private final int beltSize;
	private Elvis(){
		beltSize=CURRENT_YEAR-1930;
	}
	private int beltSize(){
		return beltSize;
	}
	
	public static void main(String args[]){
		System.out.println("Elvis wears a size : "+INSTANCE.beltSize()+" belt.");
	}
}

    因为今年是2014年,可能会认为beltSize的结果是84(2014-1930)。但是事实证明beltSize是-1930。

原因分析:执行 public static final Elvis INSTANCE=new Elvis();构造函数的时候,CURRENT_YEAR已经变成0了,所以beltSize变成了-1930。

 

其实只要交换一下两条语句的顺序就搞定了,就解决了类初始化循环问题。

private static final int CURRENT_YEAR=Calendar.getInstance().get(Calendar.YEAR);
public static final Elvis INSTANCE=new Elvis();

 

分享到:
评论

相关推荐

    C++全局变量初始化的一点总结

    初始化顺序方面,同一编译单元内的全局变量按照声明顺序进行初始化,但不同编译单元间的全局变量的初始化顺序是不确定的,这可能导致潜在的问题。如果全局变量之间存在依赖关系,最佳实践是重构代码以消除这种依赖。...

    Java类加载器:静态变量初始化.docx

    在本文中,我们讨论了 Java 类加载器中的静态变量初始化机制,了解了静态变量的初始化顺序和类加载器的生命周期。通过对静态变量初始化机制的理解,我们可以更好地掌握 Java 语言的基础知识,并更好地应用 Java 语言...

    学习java静态数据初始化.doc

    如果一个静态变量依赖于另一个静态变量的值,那么这两个变量的初始化顺序是重要的。 在给定的代码中,我们可以看到有多个静态变量的声明和初始化。这些静态变量的初始化顺序是按照它们在类中的定义顺序进行的。例如...

    关于Java静态成员变量和静态初始化块等的初始化顺序的详细介绍

    详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

    探究java的ClassLoader及类变量初始化顺序

    同时,掌握类变量初始化顺序可以避免因误解而导致的错误,特别是在多线程环境中,对静态变量的并发访问和初始化顺序的控制需要特别注意。 总之,深入理解Java的ClassLoader机制和类变量初始化顺序是提升Java编程...

    java类变量初始化顺序

    详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。

    Java中static静态变量的初始化完全解析

    ### 静态变量初始化的基本规则: 1. **默认初始化**:当类被加载时,静态变量首先会被赋予其数据类型的默认值。例如,`int`类型的静态变量会被初始化为`0`,`boolean`为`false`,引用类型为`null`。 2. **显式初始化...

    VC++全局变量初始化-16.09.26

    值得注意的是,同一段内的全局变量初始化顺序是不可预测的,这意味着在同一个段内的 `C1` 和 `C2` 的初始化顺序不能保证。 ##### 1.4 EXE 调用 DLL 当一个EXE文件调用DLL文件时,DLL内的全局变量初始化顺序也需要...

    Java变量初始化

    Java 变量初始化详解 Java 变量初始化是 Java 语言的基础知识点之一,但也往往被学习者所忽略。 Java 变量初始化的时机是指在 Java 语言中变量的初始化过程,包括变量的声明、初始化和赋值的步骤。 Java 变量声明 ...

    类初始化顺序示例讲解

    此时 `basecode` 已经被初始化,因此输出为 `"我输出的是父类非静态块内容→父类非静态变量初始化"`。 10. **父类构造函数**:调用 `BaseClass()` 构造函数,其中 `basecode` 被设置为 `"父类构造方法里该修了的...

    java中静态与非静态的变量定义与使用

    这强调了静态变量初始化时可以执行的方法调用,而这些方法调用是在任何对象创建之前进行的。 此外,注意到 `main` 方法中 `t2.f2(1)` 和 `c1.f3(1)` 的调用。由于 `t2` 和 `c1` 是静态变量,我们可以直接通过它们...

    类继承的初始化顺序类,继承的初始化顺序

    本文详细介绍了类继承中的初始化顺序问题,包括初始化的基本概念、初始化过程中的关键步骤以及如何正确处理基类和子类之间的构造函数调用。理解这些概念对于编写高效、可维护的面向对象程序至关重要。希望通过对这些...

    Java静态初始化块和对象初始化块

    静态初始化块常用于设置类级别的变量,或者执行只应执行一次的初始化操作。例如,如果一个类需要在程序运行前设置一个常量数组,静态初始化块就是合适的选择。 ```java public class InitFiledBlockStatic { ...

    MDK下怎样才能让变量在复位时不被初始化

    在MDK(Keil)开发环境下,为了在单片机,如STM32,复位时保持变量的值不变,我们需要解决一个关键问题,即如何防止变量在复位时被自动初始化。通常,MDK会将全局变量和静态变量默认初始化为零。然而,根据项目需求...

    C# 公有变量 私有变量 静态变量

    静态变量在类加载时初始化,并且在整个程序生命周期内保持其值。例如: ```csharp public class MyClass { static int StaticVar = 10; // 静态变量 public static void ModifyStaticVar() { StaticVar += 1; ...

    Java静态和非静态成员变量初始化过程解析

    通过这两个示例,我们可以看到,非静态成员变量的初始化顺序是:成员变量初始化语句>成员变量初始化块>构造函数。 而对于静态成员变量,它们是在类加载时初始化的。例如,我们可以定义一个静态成员变量static ...

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    JAVA面试题解惑系列——类的初始化顺序

    首先,需要了解Java类初始化的基本规则,即在类的静态变量、静态初始化块、变量、初始化块、构造器这五个部分中,它们的初始化顺序依次是:静态变量、静态初始化块、变量、初始化块、构造器。这个顺序在单个类中是...

    java面试题-类的初始化顺序.doc

    这个顺序表明,无论类之间的继承关系如何,初始化顺序始终是:静态变量和静态初始化块先于非静态成员。在创建对象时,父类的初始化先于子类。这是Java语言规范所规定的,确保在子类访问父类的静态或非静态成员时,...

Global site tag (gtag.js) - Google Analytics