gpt4 book ai didi

java - 为什么我的子类构造函数没有被调用?

转载 作者:行者123 更新时间:2023-12-01 07:12:21 25 4
gpt4 key购买 nike

我有这个继承结构:

public abstract class Mom {
int dummy;
Mom() {
dummy = 0;
}
Mom(int d) {
this();
dummy = d;
}
}
public class Kid extends Mom {
String foo;
Kid() {
super();
foo = "";
}
Kid(int d) {
super(d);
}
}
// ...
Kid kiddo = new Kid(10);
// kiddo.foo == null !

我的 Kid 无参数构造函数从未被调用!这是我的预期:

  1. new Kid(10)Kid#Kid(int)
  2. super(d)Mom#Mom(int)
  3. this()Kid#Kid()//哎呀!!
  4. super()Mom#Mom()

Mom 是否可以调用 Kid 的无参数构造函数?
我想不是,我将添加一个抽象方法[1] init()Mom 会调用该方法,Kid 会< em>必须覆盖。
但我只是想知道确切的原因,如果可能的话,举例说明为什么想要调用子类的构造函数是一个坏主意(即使子类的构造函数确实调用super())。

// in Mom:
protected abstract void init();
public Mom() {
dummy = 0;
init();
}

// in Kid:
@Override
protected abstract void init() {
foo = "";
}

最佳答案

我安排这些的方式,这样你就不需要调用每个构造函数。

public abstract class Parent {
final int dummy;

Parent () {
this(0);
}
Parent (int d) {
dummy = d;
}
}

public class Kid extends Parent {
final String foo = "";

Kid() {
}

Kid(int d) {
super(d);
}
}

使用 final 确保每个字段都设置一次。

<小时/>

从构造函数调用任何可重写的方法被认为是不好的做法,因此使构造函数可重写是一个坏主意。

<小时/>

this() 调用同一个类的构造函数,因为构造函数不遵循继承(静态方法也不遵循)

new Kid(10) --> Kid#Kid(int)
super(d) --> Mom#Mom(int)
this() --> Mom#Mom()

构造函数会执行此操作,否则您将面临多次调用同一构造函数的危险,并且无法保证 final方法仅设置一次。

关于java - 为什么我的子类构造函数没有被调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11879865/

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