Java默认构造函数

问题

究竟什么是默认构造函数 - 你能告诉我以下哪一个是默认构造函数,以及它与其他构造函数的区别是什么?

public Module() {
   this.name = "";
   this.credits = 0;
   this.hours = 0;
}

public Module(String name, int credits, int hours) {
   this.name = name;
   this.credits = credits;
   this.hours = hours;
}

#1 热门回答(204 赞)

他们都不是。如果你定义它,它不是默认值。

除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。它会将任何未初始化的字段初始化为其默认值。对于你的示例,它看起来像假设类型是String,intint

public Module()
{
  super();
  this.name = null;
  this.credits = 0;
  this.hours = 0;
}

这完全一样

public Module()
{}

和根本没有构造函数完全相同。但是,如果定义至少一个构造函数,则不会生成默认构造函数。

参考:Java Language Specification

###澄清

从技术上讲,默认初始化字段不是构造函数(默认或其他)。但是,我在答案中留下了这个

  • 问题是默认错误和
  • 包括或不包括它们,构造函数具有完全相同的效果。

#2 热门回答(28 赞)

如果未在类中定义任何构造函数,则会创建默认构造函数。它只是一个没有参数的构造函数。编辑:除了调用super()

public Module(){
}

#3 热门回答(17 赞)

如果你没有在类中明确定义至少一个构造函数,则编译器会自动生成默认构造函数。你已经定义了两个,所以你的类没有默认的构造函数。

PerThe Java语言规范第三版:

8.8.9默认构造函数如果类不包含构造函数声明,则会自动提供不带参数的默认构造函数...