java中默认构造函数的实际使用

Mit*_*hra 0 java default-constructor

当程序员无法向类编写任何构造函数时,编译器会提供默认构造函数。据说这些构造函数用于初始化类属性的默认值。但是,如果程序员提供了一个构造函数,则可以是简单的构造函数,例如:

public class Main {
  int a;

  Main() { // user defined simple constructor
    System.out.println("hello");
  }

  public static main(String[] args) {
    Main obj = new Main();
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,用户包含了一个构造函数。但是它不会初始化实例变量(a)。此外,默认构造函数不会被调用。那么为什么变量“a”被初始化为其默认值呢?

如果默认构造函数不会将类变量初始化为其默认值,而编译器会自动执行此操作,那么默认构造函数的实际用途是什么?

为什么在用户无法编写构造函数的情况下,编译器会添加默认构造函数?

And*_*ner 5

\n

那么为什么变量“a”会被初始化为其默认值呢?

\n
\n

因为语言指定字段被初始化为其默认值。具体来说,JLS 4.12.5

\n
\n

程序中的每个变量在使用其值之前都必须有一个值:

\n
    \n
  • 每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化(\xc2\xa715.9、\xc2\xa715.10.2):\n
      \n
    • ...
    • \n
    • 对于 int 类型,默认值为零,即 0。\n
        \n
      • ...
      • \n
      \n
    • \n
    \n
  • \n
\n
\n

即使您确实在构造函数中初始化了它,您也可以事先读取该字段并观察其默认值。例如:

\n
  Main() { // user defined simple constructor\n    System.out.println(a);  // Prints 0\n    a = 1;\n  }\n
Run Code Online (Sandbox Code Playgroud)\n

尽管它在 Java 中对您来说大部分是隐藏的,new Main()但它执行两个独立的操作(有关更多详细信息,请参阅JLS 15.9.4,因为它实际上不仅仅是两个操作):

\n
    \n
  • 它创建一个实例Main
  • \n
  • 然后它调用构造函数来初始化该实例。
  • \n
\n

字段初始化为其默认值实际上是在创建实例时发生的(第一步,如上面引用 JLS 中所述);因此,即使调用构造函数的第二步没有发生,字段仍然会初始化为其默认值。

\n
\n

为什么在用户无法编写构造函数的情况下,编译器会添加默认构造函数?

\n
\n

因为否则你将无法创建该类的实例。

\n

此外,默认构造函数(就像所有不在this(...)第一行调用的构造函数一样)调用超级构造函数。所以,它看起来像这样:

\n
Main() {\n  super();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您必须调用类的超级构造函数才能对基类进行必要的初始化。

\n