先看一个代码,猜猜看会输出什么:
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();
相关推荐
详细介绍了Java的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序
详细讲解java类中静态变量,普通标量,对象、基本类型的初始化顺序。
static所声明的变量在Java中有一个初始化的先后顺序,带着这个问题接下来我们就来进行Java中static静态变量的初始化完全解析:
java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
我们知道类的生命周期分为装载、连接、初始化...这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,必须在定义的时候对其
C++ 成员变量的初始化顺序问题详解 问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout <&...
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器
我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:
初始化列表的初始化顺序是依据类成员变量定义的顺序来决定的。 3.关于static const是否应该在初始化成员列表中初始化? static const为全局静态常量,全局的意思是该变量属于整个类而非某个类实例,所以不能再...
上述代码,分别输出0,1,2 静态变量$a在第一次定义并初始化后就会常驻内存,直到脚本执行完毕。 当第二次调用msg()函数时,这时的$a值为1,而不会变成0。 那么问题来了,请看下面的一段代码: $data = array( array...
未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化。 2、继承时,对象的初始化过程 (1) 主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。 (2) 主类静态...
在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量...静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(这一点非常的重要);静态局部变量一般在声明处初始化
静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先声明的先执行 ()方法只会执行一次 如以下代码: //静态变量显式赋值代码 private static int j=method(); //静态代码块 static { System....
对象创建和初始化过程3.1 new对象底层字节码指令分析3.2 对象初始化过程详解【重点】3.2.2 实例变量初始化顺序分析3.2.3 继承中实例变量初始化顺序四 类实例化顺序总结4.1 类初始化阶段4.2 对象的创建和初始化阶段...
都知道用static修饰的变量是静态数据,此时变量的地址在静态区存放,因此在函数结束时,该地址中的值不被释放,除非主函数结束。因此每次访问该地址所指向的变量,都会有上次的值。但是会出现一个问题......
以下这段小程序对调用对象构造函数时,父类构造函数、成员变量初始化函数,以及非静态初始化块调用顺序进行验证,不考虑静态成员及静态初始化块
了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识。不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println...
全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放4.另外还有一个专门放常量的地方。- ...
如何在C11中使用线程安全的初始化程序来初始化全局变量。 概述 avar在C11中支持跨平台的线程安全静态初始化。 C ++ 11支持非平凡构造的全局变量的线程安全初始化,这意味着通过运行代码初始化的变量。 在C11中以便携...