【问题标题】:Java classes and static blocksJava 类和静态块
【发布时间】:2014-07-22 18:56:20
【问题描述】:
class Hello12 {
    static int b = 10;
    static {
        b = 100;
    }
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

在运行上面的代码时,输​​出为 100,因为当我调用 Hello 类时,首先执行静态块,将 b 的值设置为 100 并显示它。 但是当我写这段代码时:

class Hello12 {
    static {
         b = 100;
    }
    static int b = 10;
}

class sample {
    public static void main(String args[]) {
        System.out.println(Hello12.b);
    }
}

这里的输出为 10。我期望答案为 100,因为一旦执行了静态块,它给 b 的值为 100。所以在 main() 中,我调用了 Hello.b它应该提到 b (=100)。两个代码中的内存是怎么分配给b的?

【问题讨论】:

  • +1。在实践中,使用final

标签: java static


【解决方案1】:

在类的“详细初始化过程”中,Section 12.4.2 of the JLS 声明:

接下来,执行类的类变量初始化程序和静态初始化程序,或接口的字段初始化程序,按文本顺序,就好像它们是单个块一样。

这意味着好像第一个示例是:

b = 10;
b = 100;

第二个例子是:

b = 100;
b = 10;

最后一个作业“获胜”,解释你的输出。

【讨论】:

  • @kocko 没关系。让我们帮助 rgettman 获得Populist 徽章。不幸的是,这意味着接受的答案需要有 10 个赞成票...
  • 如果它以“文本顺序”运行,为什么它会编译? b 在静态块中设置时肯定没有声明?
  • 因为编译器 like always 将变量 DECLARATION 与赋值分开。就像过去的美好时光一样,首先声明每个变量,在任何分配发生之前找到内存中的一个好地方并使其舒适;-)
【解决方案2】:

静态块和静态变量按照它们在源代码中出现的顺序进行初始化。如果您的代码是:

class Hello12 {

  static int b = 10;
  static {
     b = 100;
  }

}

结果是 100。

【讨论】:

    【解决方案3】:

    除了回答代码如何以什么顺序执行的问题之外,我猜你还想知道为什么静态块可以引用尚未以文本形式声明/执行的静态变量。

    虽然section 12.4.2 of the JLS 确实解释了静态块和静态变量按照它们出现的文本顺序执行,但section 8.3.3 of the JLS 解释了您何时可以引用什么,并且您可以看到The use is not on the left hand side of an assignment; 的条件失败,允许您的第二个示例中的静态块引用尚未按文本顺序声明/执行的静态变量。

    【讨论】:

      【解决方案4】:

      统计数据按照它们在程序中出现的顺序进行评估。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 2010-12-23
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        相关资源
        最近更新 更多