在构造函数中放入super()是不必要的吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

如果我不将它放入子类的构造函数中,编译器不是会自动将它放入吗?

这意味着我根本不需要管它?

提问于
用户回答回答于

首先是一些术语:

  • 无参数构造函数:不带参数的构造函数;
  • 可访问无参数构造函数:子类中可见的超类中的无参数构造函数。
  • 默认构造函数:在类中没有显式构造函数时由编译器添加的公共无参数构造函数。

所以所有的类至少有一个构造函数。

子类构造函数可以指定它们在执行子类的构造函数中的代码之前调用超类中的哪个构造函数。

如果子类构造函数未指定要调用哪个超类构造函数,则编译器将自动调用超类中的可访问无参数构造函数。

如果超类没有无参数构造函数,或者它不可访问,那么不指定要调用的超类构造函数(在子类构造函数中)是编译器错误,因此必须指定它。

例如:

public class Base { }
public class Derived extends Base { }

这很好,如果你没有明确添加构造函数,Java会为你提供一个公共的默认构造函数。

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

也行

public class Base { public Base(String s) { } }
public class Derived extends Base { }

编译错误,因为Base没有默认构造函数。

public class Base { private Base() { } }
public class Derived extends Base { }

也是错误,因为Base的无参数构造函数是私有的。

扫码关注云+社区