Java 构造函数与内联字段初始化

标签 java constructor initialization field compiler-optimization

如果我有以下代码:

public class Test {

   private int x = 5;
   private static int y = 5;

   public Test() {
      x = 10;
      y = 10;
   }
}

我想知道在这两种情况下它实际上会首先分配 5,然后用 10 更新它,换句话说,没有必要在内联和构造函数中初始化变量,因为它实际上具有初始化变量两次的效果?或者在 x (作为实例字段)的情况下,它是否只是将 x = 5 替换为 x = 10,因此甚至只运行 x = 10?

如果能知道反编译版本就好了。

最佳答案

I'm wondering in both cases will it actually initially assign 5, and then update this with 10

是的。构造函数将:

  1. 调用super()
  2. 执行任何内联初始化和匿名初始化 block 。
  3. 执行构造函数的其余部分。

这在 JLS #12.5-6 中有更详细的说明。 .

关于Java 构造函数与内联字段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421411/

相关文章:

c++ - 调用不带参数的构造函数有效,带参数则无效。为什么?

c++ - 使用带有虚函数的类的构造函数进行大括号初始化

java - 为什么编译器禁止数组初始化?

java - Log4j2 JSONLayout 时间戳模式

qt - 我应该如何重载构造函数

java - 使用 JButton ActionListener 在同一个包中运行不同的类

c - 二维数组 - C 中的无效初始值设定项?

java - Java VM 上的 Android 错误。运行 Java SE 7

java - net::ERR_CONNECTION_RESET 与 Tomcat 6

java - 如何让 Apache POI 和 JAXB 协同工作?