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