`

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

 
阅读更多

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

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的静态成员变量、静态数据块、非静态成员变量和非静态成员变量等初始化顺序

    java类变量初始化顺序

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

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

    static所声明的变量在Java中有一个初始化的先后顺序,带着这个问题接下来我们就来进行Java中static静态变量的初始化完全解析:

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

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

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

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    Java中的静态变量、静态方法与静态代码块

    我们知道类的生命周期分为装载、连接、初始化...这种情况比较特殊,主要问题是由于静态变量是一个对象的引用,那么必须初始化这个对象之后才能将引用指向它。因此如果要把一个引用定义成static的,必须在定义的时候对其

    C++ 成员变量的初始化顺序问题详解

    C++ 成员变量的初始化顺序问题详解 问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout <&...

    java类中元素初始化顺序详解

    对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器

    JAVA面试题解惑系列

    我们大家都知道,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。我们也可以通过下面的测试代码来验证这一点:

    关于C++中构造函数初始化成员列表的总结

     初始化列表的初始化顺序是依据类成员变量定义的顺序来决定的。 3.关于static const是否应该在初始化成员列表中初始化?  static const为全局静态常量,全局的意思是该变量属于整个类而非某个类实例,所以不能再...

    php 函数中静态变量使用的问题实例分析

    上述代码,分别输出0,1,2 静态变量$a在第一次定义并初始化后就会常驻内存,直到脚本执行完毕。 当第二次调用msg()函数时,这时的$a值为1,而不会变成0。 那么问题来了,请看下面的一段代码: $data = array( array...

    Java开发者文档,分享日常学习的一些小知识点 .rar

     未创建此类对象)的静态对象时,所有的静态变量也要按它们在类中的顺序初始化。  2、继承时,对象的初始化过程  (1) 主类的超类由高到低按顺序初始化静态成员,无论静态成员是否为private。  (2) 主类静态...

    c++静态局部变量和静态函数示例

    在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量...静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化(这一点非常的重要);静态局部变量一般在声明处初始化

    【Java高频面试题】–类的初始化过程以及实例的初始化过程

    静态变量显式赋值代码以及静态代码块的执行顺序,由它们的先后顺序执行,先声明的先执行 ()方法只会执行一次 如以下代码: //静态变量显式赋值代码 private static int j=method(); //静态代码块 static { System....

    类实例化顺序讲解 附阿里巴巴一道笔试题

    对象创建和初始化过程3.1 new对象底层字节码指令分析3.2 对象初始化过程详解【重点】3.2.2 实例变量初始化顺序分析3.2.3 继承中实例变量初始化顺序四 类实例化顺序总结4.1 类初始化阶段4.2 对象的创建和初始化阶段...

    一个简单的static类型的初始化问题

    都知道用static修饰的变量是静态数据,此时变量的地址在静态区存放,因此在函数结束时,该地址中的值不被释放,除非主函数结束。因此每次访问该地址所指向的变量,都会有上次的值。但是会出现一个问题......

    java对象初始化顺序验证示例

    以下这段小程序对调用对象构造函数时,父类构造函数、成员变量初始化函数,以及非静态初始化块调用顺序进行验证,不考虑静态成员及静态初始化块

    Java类中各成员初始化的顺序

    了解java中类各个成员的初始化顺序是非常重要的,这样你可以对类有全局的认识。不说太多,直接看下面的例子 class Father { static{ System. out.println("父类静态代码块初始化" ); } { System. out.println...

    探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题

    全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放4.另外还有一个专门放常量的地方。- ...

    avar:C11中的可移植线程安全初始化

    如何在C11中使用线程安全的初始化程序来初始化全局变量。 概述 avar在C11中支持跨平台的线程安全静态初始化。 C ++ 11支持非平凡构造的全局变量的线程安全初始化,这意味着通过运行代码初始化的变量。 在C11中以便携...

Global site tag (gtag.js) - Google Analytics