即使未调用默认构造函数,显式构造函数仍具有默认值。

时间:2012-08-29 03:12:37

标签: java

根据我的理解,默认构造函数将对象的状态初始化为默认值,所以如果我提供这样的显式无参数公共构造函数,那么d和e的值如何仍然初始化为零,因为在此case不调用默认构造函数。

public class B extends A{

    private int d;
    private int e;

    public B() {
        System.out.println(d);
        System.out.println(e);
    }
}

编辑::默认构造函数唯一做的就是调用super()然后如果我在这里有一个明确提到的构造函数,并且A有一个受保护的变量,说c在其构造函数中初始化为17。我是否应该明确地要求super()能够看到更改,因为我使用自己的构造函数?为什么B仍然通过继承获得17的值?

3 个答案:

答案 0 :(得分:7)

如果未在声明,初始化程序块或构造函数中显式初始化它们,则会为所有类字段分配默认值。对象初始化为null,int为0,booleans为false,double为0.0,float为0.0f,long为0L,char为'\ u0000` ...

请参阅JLS, section 4.12.5. Initial Values of Variables,因为它解释了所有内容。

请注意,这些规则不适用于任何块或方法本地的变量,而是在使用前由编码器显式初始化局部变量

修改
关于你的编辑:

  

默认构造函数的唯一作用是调用super()然后如果我在这里有一个明确提到的构造函数,并且A有一个受保护的变量,说c在其构造函数中初始化为17。我是否应该显式调用super()才能看到更改,因为我正在使用自己的构造函数?为什么B仍然通过继承获得17的值?

答案:super()默认构造函数在B的构造函数的最开头被调用,无论你是否明确地调用它。通过在此显式调用超级构造函数获得的唯一额外好处是允许您为A调用非默认构造函数(如果存在),并且如果您愿意的话。

答案 1 :(得分:1)

由于您已使用原始类型的数据成员,因此它们默认为language specifications的值,在这种情况下,您可以选择值。

您可以使用构造函数初始化您不希望按照规范默认的类的所有成员(默认情况下,对象获取null值)。

答案 2 :(得分:0)

很简单,变量得到默认值,因为你没有初始化它们。 整数

的默认值为0