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”被初始化为其默认值呢?
如果默认构造函数不会将类变量初始化为其默认值,而编译器会自动执行此操作,那么默认构造函数的实际用途是什么?
为什么在用户无法编写构造函数的情况下,编译器会添加默认构造函数?
\n\n那么为什么变量“a”会被初始化为其默认值呢?
\n
因为语言指定字段被初始化为其默认值。具体来说,JLS 4.12.5:
\n\n\n程序中的每个变量在使用其值之前都必须有一个值:
\n\n
\n- 每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化(\xc2\xa715.9、\xc2\xa715.10.2):\n
\n\n
\n- ...
\n- 对于 int 类型,默认值为零,即 0。\n
\n\n
\n- ...
\n
即使您确实在构造函数中初始化了它,您也可以事先读取该字段并观察其默认值。例如:
\n Main() { // user defined simple constructor\n System.out.println(a); // Prints 0\n a = 1;\n }\nRun Code Online (Sandbox Code Playgroud)\n尽管它在 Java 中对您来说大部分是隐藏的,new Main()但它执行两个独立的操作(有关更多详细信息,请参阅JLS 15.9.4,因为它实际上不仅仅是两个操作):
Main字段初始化为其默认值实际上是在创建实例时发生的(第一步,如上面引用 JLS 中所述);因此,即使调用构造函数的第二步没有发生,字段仍然会初始化为其默认值。
\n\n\n为什么在用户无法编写构造函数的情况下,编译器会添加默认构造函数?
\n
因为否则你将无法创建该类的实例。
\n此外,默认构造函数(就像所有不在this(...)第一行调用的构造函数一样)调用超级构造函数。所以,它看起来像这样:
Main() {\n super();\n}\nRun Code Online (Sandbox Code Playgroud)\n您必须调用类的超级构造函数才能对基类进行必要的初始化。
\n| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |