【问题标题】:Constructor in Child Class子类中的构造函数
【发布时间】:2020-12-11 09:18:47
【问题描述】:

为什么需要B 中的构造函数? IntelliJ 建议删除=null,因为它可能是多余的,因为它是通过A 中的给定构造函数初始化的。 但是,这种删除(可能也由编译器执行)然后(可能)需要 B 中的构造函数。

还有其他解释吗?

public abstract class A {
  private Object foo = null;
  public A(Object foo){this.foo=foo;}
}

public class B extends A {
  public B(Object foo){super(foo);}
}

【问题讨论】:

  • 如果B没有构造函数,怎么调用父类构造函数?

标签: java inheritance constructor


【解决方案1】:

Java 没有“构造函数继承”。初始化A 的唯一方法是将foo 参数传递给它的构造函数,而这样做的唯一方法是为B 创建一个构造函数。

但是请注意,它们不必具有相同的签名(就像您在问题中的那样)-B 的构造函数只需将 some 参数传递给A .例如:

public class B extends A {
    public B() {
        super("Arbitrary default passed to A");
    }

    public B(Object passedToA, Obejct notPassedToA) {
        super(passedToA);
        System.out.println("This argument was not passed to A():" + notPassedToA);
    }
}

【讨论】:

    【解决方案2】:

    为什么需要B中的构造函数?

    如果class B extends Aclass B 必须以所有可能的方式实例化,class A 可以是,class B 可以有其他方式来实例化。这意味着class B被强制有一个构造函数。

    唯一的例外是在无参数构造函数的情况下,因为编译器使用默认构造函数来弥补它,即如果您在class A 中放置一个无参数构造函数,则子类不会强制使用它。

    【讨论】:

    • 如果A 不是abstractB 中对构造函数的需求将是相同的,因此解释有些误导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多