2

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

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 的值?

4

3 回答 3

7

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

请参阅JLS,第 4.12.5 节。变量的初始值,因为它解释了这一切。

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

编辑
关于您的编辑:

默认构造函数所做的唯一事情是调用 super() 那么如果我在这里明确提到了一个构造函数并且 A 有一个受保护的变量说 c 在其构造函数中初始化为 17 怎么办。由于我使用自己的构造函数,我不应该显式调用 super() 来看到这种变化吗?为什么 B 仍然通过继承获得 17 的值?

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

于 2012-08-29T03:14:10.047 回答
1

由于您使用了原始类型的数据成员,因此它们默认为根据语言规范的值,在这种情况下,您将选择值。

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

于 2012-08-29T03:36:45.457 回答
0

它很简单,变量在您没有初始化它们时获得它们的默认值。整数的默认值为 0

于 2012-08-29T07:23:49.203 回答