【问题标题】:Explicit constructor still has default values even though a default constructor is not invoked.即使未调用默认构造函数,显式构造函数仍具有默认值。
【发布时间】:2012-08-29 15:23:49
【问题描述】:

根据我的理解,默认构造函数将对象的状态初始化为默认值,所以如果我提供像这样的显式无参数公共构造函数,那么 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的值?

【问题讨论】:

    标签: java


    【解决方案1】:

    如果您没有在声明、初始化程序块或构造函数中显式初始化它们,所有类字段都会被分配默认值。对象初始化为 null,ints 为 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 的非默认构造函数(如果存在并且如果您愿意的话)。

    【讨论】:

    • 更正布尔默认值为 false。
    • @Vulcan:谢谢。发布此消息后,我从 JLS 获得了所有默认值的列表。我已经用链接编辑了我的答案。
    【解决方案2】:

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

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

    【讨论】:

    • 对象也获得默认值,就像根据 JLS 的原语一样。这一切都定义明确。
    • 我认为更好的说法是:如果您不希望为变量分配默认值,则在声明、初始化程序块或构造函数中显式初始化它们。这适用于 所有 变量、引用 或 原语。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-09
      • 2023-03-20
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多