我有这个班级
class A {
int a;
int b;
int c;
A() {
a = 3;
b = 4;
}
}
这是构造函数,它初始化两个实例变量。第三个实例变量会发生什么?它是否会被默认构造函数初始化?如果是,那么通话顺序是什么?
答案 0 :(得分:1)
如果您使用javap
反编译您的课程,您会发现:
Compiled from "A.java"
class A {
int a;
int b;
int c;
A();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_3
6: putfield #2 // Field a:I
9: aload_0
10: iconst_4
11: putfield #3 // Field b:I
14: return
}
即使不知道这个字节码的含义,你也可以看到构造函数中提到了a
和b
(这是它们在构造函数中的分配位置),但是只提到了{{ 1}}在字段声明c
中。因此,构造函数中的int c
没有任何反应。
因为它没有显式初始化,所以它将具有默认的初始值,如JLS Sec 4.12.5中所述。
每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10.2):
- ...
- 对于int类型,默认值为零,即0。
- ...
所以c
的值为零,但不是由于构造函数的调用(就JVM而言,与实例的创建不同)。