gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:40:48 30 4
gpt4 key购买 nike

根据我的理解,默认构造函数将对象的状态初始化为默认值,所以如果我提供像这样的显式无参数公共(public)构造函数,那么 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 有一个 protected 变量,例如 c,它被初始化为 17,那为什么会这样呢?在它的构造函数中。由于我使用自己的构造函数,我是否应该不显式调用 super() 才能看到该更改?为什么B通过继承得到的值还是17?

最佳答案

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

请参阅JLS, section 4.12.5. Initial Values of Variables因为它解释了这一切。

请注意,这些规则不适用于任何 block 或方法的本地变量,但本地变量必须在使用前由编码器显式初始化。

编辑
关于您的编辑:

The only thing default constructor does is call to super() then how come if i have a explicitly mentioned a constructor here and A has a protected variable say c which is initialized to 17 in its constructor. Should I not be explicitly calling super() to be able to see that change since I'm using my own constructor ? Why is B still getting the value of 17 through inheritance ?

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

关于java - 即使未调用默认构造函数,显式构造函数仍然具有默认值。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170399/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com