如果我们定义自己的构造函数,那么java如何将实例变量初始化为其默认值

时间:2012-06-11 09:09:43

标签: java default-value default-constructor

Java使用默认构造函数为实例变量分配默认值。但是如果我们定义自己的构造函数,那么java如何给出默认值(因为当我们编写构造函数时,则不会添加默认构造函数)。

4 个答案:

答案 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

  1. 对象的空间在堆上分配,对象的大小和类与对象关联。

  2. 对象的所有字段都设置为默认值;即null或引用类型,以及原始类型的零或假。

  3. 评估superthis参数(如果有)的参数表达式,并以递归方式调用构造函数链。

  4. 如果尚未对它们进行评估(通过this链接),则会按顺序评估/执行此类的任何实例字段初始值设定项和任何初始值设定项块。

  5. 执行构造函数体的其余部分(如果有)以完成对象初始化。

  6. 无论是显式声明的构造函数还是默认构造函数,都使用相同的过程。对于只调用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);
    }

}

我重写了默认构造函数。虽然我在构造函数中什么都没做,但是变量已经分配了。