假设我有一个名为Person的课程:
SELECT Table1.UserID, COUNT(DISTINCT Table1.TheDate) AS NumDates FROM Table1;
当调用Person类的空构造函数时,Java会先将num初始化为默认值零,然后将num赋值为1吗?或者Java会立即将num初始化为1吗?除非你使用初始化语法,否则C ++不会做前者吗?
谢谢!
答案 0 :(得分:13)
首先将值赋值为零。
如果你在字段声明之前放了一些东西,你可以看到:
class Person{
{ print(); }
private int num = 1;
{ print(); }
void print() {
System.out.println(num);
}
}
这将打印:
0
1
中对此进行了描述
每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化
Sec 15.9.4(强调添加,部分省略):
新对象包含在指定类类型及其所有超类中声明的所有字段的新实例。 在创建每个新字段实例时,会将其初始化为其默认值(§4.12.5)。
...
接下来,调用指定类类型的选定构造函数 ...
换句话说,对象创建和构造函数调用是不同的操作,并且在调用构造函数之前将字段初始化为其默认值。
实际的字段初始化发生在构造函数中:字段初始化内联到调用super(...)
之后立即调用super(...)
的每个构造函数。以下完全等同于上述内容:
class Person{
private int num;
Person() {
super();
print();
num = 1;
print();
}
void print() {
System.out.println(num);
}
}
尽管声明字段final
会产生此代码的输出,但有一个微妙的要点:
1
1
这并不意味着最终变量会更早初始化。在这种情况下发生的所有变化都是num
已成为编译时常量表达式,因此内联。因此,print()
实际上将执行:
System.out.println(1);
换句话说,它根本不读取该字段。
答案 1 :(得分:0)
答案 2 :(得分:0)
boolean false
byte (byte) 0
short (short) 0
int 0
long 0L
char \u0000
float 0.0f
double 0.0d
object reference null
以下是Java的所有默认值。默认情况下,这将是init的任何变量。因此,通过Andy的回答,我可以得出结论,它将始终为0,然后它将按照您给变量赋予的值。