Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Java中定义“默认构造函数”吗?_Java_Constructor_Theory - Fatal编程技术网

我可以在Java中定义“默认构造函数”吗?

我可以在Java中定义“默认构造函数”吗?,java,constructor,theory,Java,Constructor,Theory,我下面的问题是理论性的,而不是实践性的。 从许多在线可用的Java资源中,我发现类的默认构造函数具有以下规范: 不需要争论 没有任何条款 他的身体是空的 Java语言不提供默认构造函数的定义,它只声明 如果类定义不包含构造函数声明,则默认 构造函数由编译器隐式声明 请注意,隐式声明的措辞意味着显式定义的默认构造函数是可能的。让我们考虑下课: public class Point { private int x; private int y; public int getX() {

我下面的问题是理论性的,而不是实践性的。 从许多在线可用的Java资源中,我发现类的默认构造函数具有以下规范:

不需要争论 没有任何条款 他的身体是空的 Java语言不提供默认构造函数的定义,它只声明

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

请注意,隐式声明的措辞意味着显式定义的默认构造函数是可能的。让我们考虑下课:

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

  public int getX() { return x; } 
  public int getY() { return y; } 
}
对于此类,编译器将生成以下默认构造函数:

public Point() {
  super();
}
我的问题是,如果我作为一个程序员将实现一个构造函数作为公共点{},它会被称为类点之上的默认构造函数吗?如果不是,那么任何显式定义的构造函数都可以被视为默认构造函数吗?我很感谢专家或对此问题绝对肯定的人给出的答案。

如果您明确定义了任何构造函数,那么它就不能是默认构造函数,即使您编写的构造函数与编译器生成的默认构造函数完全相同。这里的默认值是指程序员在没有任何操作的情况下

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

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

如果在类中没有声明构造函数,那么编译器将生成一个默认构造函数。 证据:如果非内部类的源代码不包含声明的构造函数,则默认构造函数(不含参数)将隐含声明§8.8.9

如果您确实在类中声明了一个或多个构造函数,即使它是无参数构造函数并且与编译器生成的默认构造函数类似,显式构造函数也将替换编译器生成的默认构造函数。为了进一步强调这一点,与编译器生成的构造函数等效的显式no-arg构造函数不是编译器生成的构造函数。 证据:向此类的源代码中添加一个或多个构造函数声明将防止隐式声明此默认构造函数,从而有效地删除构造函数,除非其中一个新构造函数也没有参数,从而替换默认构造函数


JLS确实定义了默认构造函数是什么。请参阅Java8语言规范的第8.8.9节;请让我们知道为什么这不是一个有效的答案不是一个理由。什么是无效的?什么是有效的?重新打开,因为编辑说明了为什么这与其他问题不同,它应该是重复的。有更多Java经验的人必须仔细检查我。如果它仍然是某个内容的副本,请重新关闭并指向副本。请注意,“证据”文本假装只是隐式定义的默认构造函数。其中没有明确定义的一个。因此,这并不是对我的问题的回答:我能用Java显式定义默认构造函数吗?你只是想装腔作势,还是你的问题背后有什么真正的价值?你现在正在进入英语中某些单词的意义领域!正如我在最初的回答中提到的,并有证据支持,您不能显式定义默认构造函数。这在Java中是一个毫无意义的语句。您可以显式定义一个构造函数,其外观和行为类似于编译器生成的默认构造函数,但它永远不会被视为默认构造函数。它将被认为只是一个用户定义的构造函数。你现在明白了吗?我能问你是否明白你读的内容吗?很明显,默认构造函数是隐式声明的,让我为您解释清楚。上面的第一点与根本没有声明构造函数的情况有关,因此编译器隐式声明了一个构造函数。好啊但是你要问的是如何创建一个显式的,第二点提到的。在英语和本上下文中,explicit是指您直接执行的操作,在本例中,您声明的构造函数的外观和行为与默认构造函数类似。然而,第二条证据告诉你,即使你这样做,那个构造器。。。。。。不被视为默认构造函数*,因为编译器构造函数已被替换。你现在明白了吗?因此,不能创建显式默认构造函数。您可以创建一个显式构造函数,其外观和行为类似于默认构造函数,但它不会被视为默认构造函数。