【问题标题】:Static variables initialization process静态变量初始化过程
【发布时间】:2013-09-01 12:02:31
【问题描述】:

我有以下代码:

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?

【问题讨论】:

    标签: java class static-members


    【解决方案1】:

    它获取您提供的值,即 10。静态变量在运行时加载

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

    来自here:-

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

    编辑:-

    请通过Detailed Initialization Procedure

    【讨论】:

    • 输出是0其实不是10
    • 这是因为你没有把 a 的值放到静态块中。尝试将其放在静态块中并查看结果。!
    • 试试这个:- static int a;静态{ a = getValue(); }
    • 我想知道变量 b 设置为 0 的确切时间。它确实设置为 0,因为我的代码是 0
    • 设置为 0 时。
    【解决方案2】:

    不,它会获得您提供的价值,也就是 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

    【讨论】:

    • 我想知道变量 b 设置为 0 的确切时间。它确实设置为 0,因为我的代码是 0
    • 当你运行 .class 文件时,所有没有任何提供值的静态 int 变量都以 0 加载到 JVM 中
    • 事情是b有一个提供的值,是10。
    • 所以为什么我得到 0 而不是 10
    • @Rollerball:- 因为你的类已经加载并且'a'是第一个静态变量。
    猜你喜欢
    • 2011-08-22
    • 2010-12-22
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多