构造函数的变量初始化

时间:2016-02-04 19:33:14

标签: java

关于变量x3,哪个构造函数初始化它?我似乎无法弄明白。它是X类的无参数构造函数吗?或者也许是对象类的默认构造函数?

  Meteor.methods({
    updateTexture: function(textureName, fileId) {
      Textures.upsert(
        {
          name:textureName
        },
        {
          $set: {
            file: fileId,
            updatedAt: Date.now()
          }
        });
    }
  });

3 个答案:

答案 0 :(得分:1)

x3是一个实例变量,它的默认值为0(对于int)。来自Java docs:

  

在声明字段时,并不总是需要分配值。声明 但未初始化的字段将由编译器 设置为合理的默认值。一般来说,此默认值将为零或null,具体取决于数据类型。

     

然而,依赖于此类默认值通常被认为是错误的编程风格。

如果它是局部变量(例如您在方法中创建的变量),则必须对其进行初始化。我会说,class X的默认构造函数初始化x3,或者你可以说,默认情况下它会被初始化为0.

答案 1 :(得分:0)

public class Hello {
    private int x;
    private int y = 0;
}

这导致以下类文件:

public class Hello {

  // Field descriptor #6 I
  private int x;

  // Field descriptor #6 I
  private int y;

  // Method descriptor #9 ()V
  // Stack: 2, Locals: 1
  public Hello();
     0  aload_0 [this]
     1  invokespecial java.lang.Object() [11]
     4  aload_0 [this]
     5  iconst_0
     6  putfield Hello.y : int [13]
     9  return
}

如果我正确阅读了以上内容:

  • y在隐式no-args构造函数
  • 中初始化
  • x 未在任何构造函数中初始化
    • Java确保编译器将默认值0分配给它 - 但是这个初始化在字节代码中看不到,所以可能由编译器决定何时初始化它(即你应该< strong> not 依赖于在任何特定时刻初始化的变量 - 即使您通过观察确定何时发生这种情况,您也无法保证它在将来或不同JVM之间不会发生变化。)

答案 2 :(得分:0)

在进入构造函数之前,它们已初始化为相关的默认值(零或null)。

看到这个类似的问题(链接到JLS):

Which run first? default values for instance variables or Super Constructors?

其他任何东西都有可能危及Java环境的封装。如果未初始化字段,可能会暴露未初始化的数据以及恶意程序可能利用的字段。