静态变量初始化过程

时间:2013-09-01 12:02:31

标签: java class static-members

我有以下代码:

public class StaticKindOfThing {
    static int a =getValue();
    static int b = 10;
    public static int getValue()
    {
        return b;
    }

    public static void main (String []args)
    {
        System.out.println(a);
    }
}

我知道默认变量设置为0,但是不是在运行时发生的吗?从上面的代码看,默认初始化为0发生在运行时之前..否则getValue应该给出编译错误或运行时异常,而不是查找值。 所以我的问题是。变量static int b = 10;在编译时是否获得0默认值?

2 个答案:

答案 0 :(得分:2)

它获得你提供的值,即10.静态变量在运行时加载

当您启动JVM并加载类StaticKindOfThing时,静态块或字段(此处a,b)将被“加载”到JVM中并可以访问。

来自here: -

  
      
  • 它是属于类的变量而不是对象(实例)
  •   
  • 静态变量仅在执行开始时初始化一次。
  •   
  • 在初始化任何实例变量之前,将首先初始化这些变量
  •   
  • 要由班级的所有实例共享的单个副本
  •   
  • 静态变量可以由类名直接访问,不需要任何对象
  •   

修改: -

请浏览Detailed Initialization Procedure

答案 1 :(得分:1)

不,它获得了你提供的价值,即10。

在你的情况下,即使你写:

static int a;

结果为0。因为你没有给出任何价值。

有时你可以写static块像:

static {
  //...
}

确保在启动课程之前该块首先运行。

当类像静态变量一样加载到JVM中时,静态初始化程序块只执行一次。

试试这个会做你想象的那个:

public class StaticKindOfThing {

static int a;
static int b = 10;

static{
    a = getValue();
}


public static int getValue()
{
    return b;
}

public static void main (String []args)
 {
    System.out.println(a);
 }
}

输出:10