是否没有必要将 super() 放在构造函数中?

2022-08-31 06:39:53

如果我不把它放在子类的构造函数中,编译器不会自动放置这个吗?

这意味着我甚至不需要关心它?在一些文章中,他们把它放了出来。

如果我有一个带有参数的构造函数,这将是构造函数,还是需要一个没有参数列表的构造函数?


答案 1

首先是一些术语:

  • 无参数构造函数:没有参数的构造函数;
  • 可访问的 no-args 构造函数:子类可见的超类中的 no-args 构造函数。这意味着它要么是公共的,要么是受保护的,或者,如果两个类都在同一个包中,则为包访问;和
  • 默认构造函数:当类中没有显式构造函数时,编译器添加的公共无参数构造函数。

因此,所有类都至少有一个构造函数。

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

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

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

例如:

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 的 no-args 构造函数是私有的。


答案 2

如果超类构造函数没有参数,Java 会自动为您调用它。如果它有参数,你会得到一个错误。

来源: http://java.sun.com/docs/books/tutorial/java/IandI/super.html