Java 在没有超类的情况下调用super()?

Java 在没有超类的情况下调用super()?,java,inheritance,constructor,Java,Inheritance,Constructor,当构造函数调用“super()”而没有对象之外的任何超类时会发生什么(如果有的话)?像这样: public class foo implements Serializable, Comparable { int[] startPoint; public foo() { super(); startPoint = {5,9}; } } 编辑:那么,如果这没有任何作用,为什么有人会在代码中显式地编写它呢?如果我删除那一行会有什么不同吗?总是有一个名为Object

当构造函数调用“super()”而没有对象之外的任何超类时会发生什么(如果有的话)?像这样:

public class foo implements Serializable, Comparable {

  int[] startPoint;

  public foo() {

    super();

    startPoint = {5,9};
  }
}

编辑:那么,如果这没有任何作用,为什么有人会在代码中显式地编写它呢?如果我删除那一行会有什么不同吗?

总是有一个名为
Object
的超类,因此它将调用
Object
的构造函数,正如您所说,有一个超类(Object)


将调用默认的对象构造函数。

只调用
对象()
构造函数,就像您有任何其他超类的构造函数没有参数一样。

super()
是构造函数中的第一个调用,无论是显式调用还是隐式调用。 (当然,您可能需要更改参数以匹配父级的构造函数。)

您的代码:

public foo() 
{
    startPoint = {5,9};
}
编译器从上面的代码中看到了什么:

public foo()
 {
    super();
    startPoint = {5,9};
 }
因此,无论您是否在代码中显式地添加了
super()
,都会调用它。
由于所有类都派生自
Object
类,因此您正在使用
super()
调用对象的构造函数,因为您的类没有任何中间父类。

它调用对象的构造函数,该构造函数为空(不做任何操作)。

super()如果对象类不是从一个类扩展而来,则始终调用构造函数

类对象是类层次结构的根。每个类都有对象作为一个超类。所有对象(包括数组)都实现此类的方法


删除行
super()总是可以的,并且扩展
对象
的类的构造函数没有什么特别之处。空超类构造函数的调用总是隐含的,因此无论您是否写下它,您总是得到完全相同的语义


请注意,这意味着,如果省略了对超类构造函数的调用,该构造函数会执行一些重要的操作,例如启动数据库连接或整个GUI,那么无论您是否实际编写
super()

阅读所有相关内容:这个答案确实为初学者提供了有价值的信息,但我担心它目前并没有真正回答这个问题。请更新它。@RohitJain你能解释一下丢失了什么吗亲爱的Rohit?@ivanovic。。实际上,OP在问,如果一个类没有超类(显式),super()调用委托到哪里。但对于这个答案,我还是会给你一个+1@RohitJain从来没有一个班级没有一个超级班级,从字面上说从来没有。所有类都继承自
对象
(当然,这个问题不适用于原语和数组除外)。他可能遗漏的唯一一件事是,不管你是否指定它,它都不会改变事情发生的顺序。这场讨论是如何在数组不是对象的谬误上达成一致的?Java中的每个数组都是
对象
的子类。当然可以,但为什么有人会编写它呢?为什么它甚至作为关键字存在?@fakefake。。若要调用超类的参数化构造函数,则需要编写它。默认情况下,编译器只添加对
0-arg构造函数的调用
@fakefake除了“清晰性”之外,没有特殊原因。Java有很多面向初学者的特性甚至是“最佳实践”。当我在我编辑过的任何代码中看到这一行时,我会立即将其删除。但是如果你质疑超类构造函数调用这个概念的存在,那就完全是另外一回事了。当然,这些电话是非常需要的(Rohit已经在上面解释过)。