关于变量x3,哪个构造函数初始化它?我似乎无法弄明白。它是X类的无参数构造函数吗?或者也许是对象类的默认构造函数?
Meteor.methods({
updateTexture: function(textureName, fileId) {
Textures.upsert(
{
name:textureName
},
{
$set: {
file: fileId,
updatedAt: Date.now()
}
});
}
});
答案 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
未在任何构造函数中初始化
0
分配给它 - 但是这个初始化在字节代码中看不到,所以可能由编译器决定何时初始化它(即你应该< strong> not 依赖于在任何特定时刻初始化的变量 - 即使您通过观察确定何时发生这种情况,您也无法保证它在将来或不同JVM之间不会发生变化。)答案 2 :(得分:0)
在进入构造函数之前,它们已初始化为相关的默认值(零或null)。
看到这个类似的问题(链接到JLS):
Which run first? default values for instance variables or Super Constructors?
其他任何东西都有可能危及Java环境的封装。如果未初始化字段,可能会暴露未初始化的数据以及恶意程序可能利用的字段。