【问题标题】:Can I define `default constructor` in Java?我可以在 Java 中定义“默认构造函数”吗?
【发布时间】:2015-04-16 17:19:58
【问题描述】:

我下面的问题是理论上的,而不是实际的。 从许多在线可用的 Java 资源中,我发现一个类的 default constructor 具有以下规范:

  1. 不接受任何参数
  2. 没有throws 子句
  3. 有一个空的身体

Java 语言specification 不提供default constructor 的定义,它只声明

如果类(定义)不包含构造函数声明,则默认 构造函数是隐式声明的(由编译器)。

请注意措辞implicitly declared 暗示显式定义的默认构造函数是可能的。让我们考虑下面的课程:

public class Point {
  private int x;
  private int y;

  public int getX() { return x; } 
  public int getY() { return y; } 
}

对于这个类,编译器会生成下面的默认构造函数:

public Point() {
  super();
}

我的问题是,如果我作为一名程序员将构造函数实现为public Point() { },是否可以将其称为default constructor 用于上述类Point?如果不是,那么任何显式定义的构造函数都可以被视为default constructor 吗?我很感谢专家或对此主题绝对确定的人的回答。

【问题讨论】:

  • JLS 确实定义了默认构造函数是什么。请参阅 Java 8 语言规范的第 8.8.9 节。
  • 如果您认为这不是重复的;请让我们知道为什么“这不是一个有效的答案”不是一个原因。什么无效?什么是有效的?
  • 重新打开,因为编辑说明了为什么这与其他应该重复的问题不同。对 Java 有更多经验的人将不得不仔细检查我。如果它仍然是某些东西的副本,请重新关闭并指向副本。

标签: java constructor theory


【解决方案1】:

如果您显式定义了任何构造函数,则它不能是默认构造函数,即使您编写的代码与编译器生成的默认构造函数完全相同。这里的默认是指程序员没有采取任何行动。

更新:OP 想要一个基于证据的答案

第 13.4.12 节方法和构造函数声明 (JLS8) 中的编译器规则:

  1. 如果您在类中未声明构造函数,则编译器会生成默认构造函数。

证据:如果非内部类的源代码不包含已声明的构造函数,则隐式声明不带参数的默认构造函数(第 8.8.9 节)。

  1. 如果您确实在您的类中声明了一个或多个构造函数,即使它是一个无参数构造函数,并且类似于编译器生成的默认构造函数,您的显式构造函数 strong> 将替换编译器生成的默认构造函数。为了进一步强调这一点,您的显式无参数构造函数相当于编译器生成的构造函数,而不是编译器生成的构造函数。

证据:在此类的源代码中添加一个或多个构造函数声明会阻止这个默认构造函数被隐式声明,有效地删除一个构造函数,除非新的构造函数之一也没有参数,从而替换默认构造函数.

【讨论】:

  • 请注意,“证据”文本仅伪装成隐式定义的default constructor。其中没有任何关于明确定义的内容。因此这不是我的问题的答案:我可以在 Java 中明确定义 default constructor 吗?
  • 你只是想学究气还是你的问题背后有一些真正的价值?您现在正在进入英语中某些单词的含义领域!正如我在原始答案中提到并有证据支持的那样,您不能明确定义默认构造函数。这是 Java 中的无意义语句。您可以显式定义一个构造函数,该构造函数的外观和行为类似于编译器生成的默认构造函数,但它永远不会被视为 DEFAULT 构造函数。它将只考虑一个用户定义的构造函数。你现在明白了吗?
  • 我能问你看懂了吗?显然存在:默认构造函数来自 implicitly 声明
  • 让我为你解释清楚。上面的第一点与根本没有声明构造函数的情况有关,因此编译器隐式声明了一个。好的?但是你问的是创建一个 explicit 的,第二点解决了这个问题。在英语中和在这种情况下,显式表示您正在直接执行的操作,在这种情况下您正在声明一个看起来和行为类似于默认构造函数的构造函数。然而,第二条证据告诉你,即使你这样做了,那个构造函数......
  • ... 不被视为 默认构造函数*,因为编译器是 REPLACED。你现在明白了么? 因此,您不能创建显式默认构造函数。您可以创建一个外观和行为类似于默认构造函数的显式构造函数,但它不会被视为默认构造函数。
猜你喜欢
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-20
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多