Java使用默认构造函数为实例变量分配默认值。但是如果我们定义自己的构造函数,那么java如何给出默认值(因为当我们编写构造函数时,则不会添加默认构造函数)。
答案 0 :(得分:8)
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
答案 1 :(得分:0)
以下是使用new
创建对象时发生的情况;见JLS 12.5
对象的空间在堆上分配,对象的大小和类与对象关联。
对象的所有字段都设置为默认值;即null
或引用类型,以及原始类型的零或假。
评估super
或this
参数(如果有)的参数表达式,并以递归方式调用构造函数链。
如果尚未对它们进行评估(通过this
链接),则会按顺序评估/执行此类的任何实例字段初始值设定项和任何初始值设定项块。
执行构造函数体的其余部分(如果有)以完成对象初始化。
无论是显式声明的构造函数还是默认构造函数,都使用相同的过程。对于只调用super()
的构造函数,默认构造函数只是一个简写。
所以......
Java使用默认构造函数为实例变量分配默认值。
实际上,默认值是在此之前分配的,并且(实际上)初始化器等在执行(空)默认构造函数之前执行。
默认构造函数不负责执行默认初始化。所以它没有被调用的事实并不重要。
答案 2 :(得分:0)
aioobe的回答是对的。我只想说出原因/方式如何:
无论您是否具有默认构造函数或独立构造函数,java编译器都会为每个构造函数构建实例初始化“方法”(称为void <init>
,构造函数的参数 - 如果你想查看反编译的字节码)。
每个<init>
“方法”的结构是:
有关详细信息,请参阅the JLS and JVMS以及in this nice introduction。
答案 3 :(得分:0)
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);
}
}
我重写了默认构造函数。虽然我在构造函数中什么都没做,但是变量已经分配了。