【发布时间】:2012-06-14 04:25:34
【问题描述】:
Java 使用默认构造函数为实例变量分配默认值。但是如果我们定义自己的构造函数,那么java如何给出默认值(因为当我们编写构造函数时,那么默认构造函数并没有添加)。
【问题讨论】:
标签: java default-value default-constructor
Java 使用默认构造函数为实例变量分配默认值。但是如果我们定义自己的构造函数,那么java如何给出默认值(因为当我们编写构造函数时,那么默认构造函数并没有添加)。
【问题讨论】:
标签: java default-value default-constructor
Java 使用默认构造函数为实例变量分配默认值。
不,不是真的。它会在执行 any 构造函数之前自动为所有成员分配默认值。
但是如果我们定义自己的构造函数,那么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 或this 参数(如果有)的参数表达式,并递归调用构造函数链。
如果尚未评估它们(通过 this 链接),则按顺序评估/执行此类的任何实例字段初始化程序和任何初始化程序块。
执行构造函数体的其余部分(如果有)以完成对象初始化。
无论是显式声明的构造函数还是默认构造函数,都使用相同的过程。默认构造函数只是调用 super() 的构造函数的简写。
所以....
Java 使用默认构造函数为实例变量分配默认值。
实际上,在此之前分配了默认值,并且(确实)初始化器等被执行之前一个(空)默认构造函数被执行。
默认构造函数不负责进行默认初始化。所以它没有被调用的事实并不重要。
【讨论】:
aioobe 的回答是对的。我只想说为什么/怎么会这样:
与你是否有默认构造函数或自己的构造函数无关,java 编译器会为每一个构造实例初始化“方法”(称为 void <init>,使用构造函数的参数 - 如果你想查看反编译的字节码)。
每个<init>“方法”的结构是:
【讨论】:
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);
}
}
我重写了默认构造函数。虽然我在构造函数中什么也没做,但变量已经赋值了。
【讨论】: