默认构造函数是否在此示例中调用或不调用

时间:2018-01-01 22:12:38

标签: java constructor

我有这个班级

class A {

  int a;
  int b;
  int c;

  A() {
    a = 3;
    b = 4;
  }

}

这是构造函数,它初始化两个实例变量。第三个实例变量会发生什么?它是否会被默认构造函数初始化?如果是,那么通话顺序是什么?

1 个答案:

答案 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
}

即使不知道这个字节码的含义,你也可以看到构造函数中提到了ab(这是它们在构造函数中的分配位置),但是只提到了{{ 1}}在字段声明c中。因此,构造函数中的int c没有任何反应。

因为它没有显式初始化,所以它将具有默认的初始值,如JLS Sec 4.12.5中所述。

  

每个类变量,实例变量或数组组件在创建时都使用默认值进行初始化(§15.9,§15.10.2):

     
      
  • ...
  •   
  • 对于int类型,默认值为零,即0。
  •   
  • ...
  •   

所以c的值为零,但不是由于构造函数的调用(就JVM而言,与实例的创建不同)。