java 静态变量初始化顺序

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

    private Elvis()
{
        beltSize = CURRENT_YEAR - 1930;
    }

    public int beltSize()
{
        return beltSize;
    }

    public static void main(String[] args)
{
        System.out.println("Elvis wears a size " + INSTANCE.beltSize() + " belt.");
    }
}

静态成员属于整个类的,在类加载完成后,已经初始化完成。

但要注意初始化顺序,按声明顺序。

如上图所示:INSTANCE初始化在CURRENT_YEAR之前,但INSTANCE初始化使用了还未初始化的CURRENT_YEAR,导致初始化错误。

具体流程:

A、第一行的INSTANCE被main方法触发,创建一个新的实例; B、类构造方法被触发,beltSize被计算,此时CURRENT_YEAR还是未初始化状态,默认值为0,导致beltSize被计算为-1930。

Java静态变量初始化遵循以下规则:

  1. 静态变量会按照声明的顺序先依次声明并设置为该类型的默认值,但不赋值为初始化的值。
  2. 声明完毕后,再按声明的顺序依次设置为初始化的值,如果没有初始化的值就跳过

java 静态变量初始化顺序,布布扣,bubuko.com

时间: 2024-10-21 02:53:34

java 静态变量初始化顺序的相关文章

Java静态方法,静态变量,初始化顺序

1. 静态方法: 成员变量分为实例变量和静态变量.其中实例变量属于某一个具体的实例,必须在类实例化后才真正存在,不同的对象拥有不同的实例变量.而静态变量被该类所有的对象公有(相当于全局变量),不需要实例化就已经存在. 方法也可分为实例方法和静态方法.其中,实例方法必须在类实例化之后通过对象来调用,而静态方法可以在类实例化之前就使用.与成员变量不同的是:无论哪种方法,在内存中只有一份——无论该类有多少个实例,都共用同一个方法. 实例方法的调用: ClassA a = new ClassA();  

静态变量初始化顺序

1. 代码 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545; min-height: 14.0px } span.s1 { font: 12.0px ".Pin

【细说Java】Java变量初始化顺序

Java的变量初始化顺序,对这里一直似懂非懂,面试的时候也经常被问到,但答的一直不好,现在整理记录一下,以后忘记了可以来看看. 程序分为两个部分,第一个部分不考虑继承,第二个部分考虑继承: (1)不考虑继承的情况 代码如下: public class JavaTest { public JavaTest() { System.out.println("执行JavaTest构造方法1"); } public JavaTest(String param) { System.out.prin

Java中的初始化顺序(静态成员、静态初始化块,普通成员、普通初始化块、构造函数)

本文链接    http://blog.csdn.net/xiaodongrush/article/details/29170099 参考文章     http://my.oschina.net/leoson/blog/103251 1. 一个类中的初始化顺序 (静态变量.静态初始化块)=>(变量.初始化块.构造器). 2. 两个具有继承关系类的初始化顺序 父类的(静态变量.静态初始化块)=> 子类的(静态变量.静态初始化块)=> 父类的(变量.初始化块.构造器)=> 子类的(变量

java类的初始化顺序

java类的初始化顺序 (2008-10-21 13:30:15) 转载▼ 标签: java 初始化 继承初始化 it 分类: Java 对于静态变量.静态初始化块.变量.初始化块.构造器,它们的初始化顺序依次是(静态变量.静态初始化块)>(变量.初始化块)>构造器.我们也可以通过下面的测试代码来验证这一点: public class InitialOrderTest { // 静态变量 public static String staticField = "静态变量";

Java实例变量初始化

由一道面试题所想到的--Java实例变量初始化 时间:2015-10-07 16:08:38      阅读:23      评论:0      收藏:0      [点我收藏+] 该题目源自微信公众号(程序员的那些事)的推送:携程 Java 工程师的一道面向对象面试题 题目是这样的:求下面程序的输出: public class Base { private String baseName = "base"; public Base() { callName(); } public v

java类内容初始化顺序

在java类中一般有:成员变量.静态变量.成员方法.静态方法.构造方法.那么这几个的初始化顺序是什么呢? 初始化的先后顺序是:静态变量(类load进内存就初始化)------静态代码块(类load进内存就初始化)--------成员变量(对象初始化时)------------初始化块------------构造函数 测试程序如下: package com.evan; /* * 初始化顺序测试 */ public class InitialOrderTest { public static Str

【java】程序初始化顺序

实例化对象时,对象所在类的所有成员变量要先进行初始化,所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象. 初始化顺序的三个原则: (1)静态优先于非静态 无论是对象还是变量,静态的初始化顺序都要优先于非静态,而且静态对象或者变量只初始化一次,而非静态对象或变量可能初始化多次 (2)父类优先于子类 (3)无论变量定义怎样散布于方法中,成员变量的初始化顺序与变量定义的顺序相同,并且在任何方法(包括构造函数)被调用之前先初始化 执行顺序: 父类静态变量 --> 父类静态代码块 --> 子

调整static变量初始化顺序的一个办法

// wrap the LaunchDir variable in a function to work around static/global initialization order static FString& GetWrappedLaunchDir() { static FString LaunchDir; return LaunchDir; } 在ue4中看到这么一段代码,注释有点意思 不同cpp文件里的全局static变量初始化顺序是不可控的 FString显然会依赖很多内存分配