Java 使用默认构造函数为实例变量分配默认值。但是如果我们定义自己的构造函数,那么java如何给出默认值(因为当我们编写构造函数时,则不会添加默认构造函数)。
4 回答
Java 使用默认构造函数为实例变量分配默认值。
不,不是。它在执行任何构造函数之前自动为所有成员分配默认值。
但是如果我们定义自己的构造函数,那么java如何给出默认值(因为当我们编写构造函数时,则不会添加默认构造函数)。
它仍然为所有成员分配默认值。
class Test {
int i;
Object ref;
Test() {
System.out.println(i);
System.out.println(ref);
}
public static void main(String[] args) {
new Test();
}
}
输出:
0
null
这是使用创建对象时发生的情况new
;见JLS 12.5
对象的空间在堆上分配,对象的大小和类与对象相关联。
对象的所有字段都设置为默认值;即
null
或引用类型,原始类型为零或假。super
or参数(如果有的话)的参数表达式this
被计算,构造函数链被递归调用。如果它们尚未被评估(通过
this
链接),则此类的任何实例字段初始化程序和任何初始化程序块都将按顺序进行评估/执行。执行构造函数主体的其余部分(如果有)以完成对象初始化。
无论是显式声明的构造函数还是默认构造函数,都使用相同的过程。默认构造函数只是调用的构造函数的简写super()
。
所以 ....
Java 使用默认构造函数为实例变量分配默认值。
实际上,在此之前分配了默认值,并且(确实)初始化程序等在执行(空)默认构造函数之前执行。
默认构造函数不负责进行默认初始化。所以它没有被调用的事实并不重要。
aioobe 的回答是对的。我只想说为什么/怎么会这样:
无论您是否拥有默认构造函数或自己的构造函数,java 编译器都会为每个构造实例初始化“方法”<init>
(称为 void ,带有构造函数的参数 - 如果您想查看反编译的字节码)。
每个<init>
“方法”的结构是:
- 调用另一个构造函数
- 实例变量初始化器(您的实例变量初始化器,以及实例初始化器)
- 构造函数体。
更多细节可以在JLS 和 JVMS以及这篇精彩的介绍中找到。
public class DefaultValue {
private boolean BOOLEAN;
private byte BYTE;
private short SHORT;
private int INT ;
private long LONG;
private float FLOAT;
private double DOUBLE;
private char CHAR;
private Object OBJECT;
public DefaultValue() {
System.out.println("I did nothing!");
}
public static void main(String args[]) {
DefaultValue dv = new DefaultValue();
System.out.println(dv.BOOLEAN);
System.out.println(dv.BYTE);
System.out.println(dv.SHORT);
System.out.println(dv.INT);
System.out.println(dv.LONG);
System.out.println(dv.FLOAT);
System.out.println(dv.DOUBLE);
System.out.println(dv.CHAR);
System.out.println(dv.OBJECT);
}
}
我重写了默认构造函数。虽然我在构造函数中什么也没做,但变量是分配的。