类OBJECT中的默认构造函数是做什么的?

我是Java初学者,学习Java编译器规则,如下所示:

  1. 如果类没有超类,则将其扩展为Object类
  2. 如果类没有构造函数,则添加默认的无参数构造函数
  3. 如果构造函数的第一行不是“super()”或“this()”,则添加“super()”来调用超类的默认构造函数。

我知道我们创建的所有对象都是从超类Object派生的。 我的问题是Object类中的构造函数在调用时会做什么?

编辑:我的问题是关于构造函数在Object类中做了什么? 我知道子类默认调用超类的构造函数。

例如,我有以下代码(我明确地扩展到Object并调用super()来说明编译器的作用)。 我的问题是,对super()的调用是做什么的?

public class Person extends Object { private String name; public Person(String n) { super(); this.name = n; } } 

我的问题是,对super()的调用是做什么的?

它调用java.lang.Object的默认构造函数。 并从Java语言规范中回答您似乎真正要求的问题,#8.8.9

8.8.9。 默认构造函数

如果类不包含构造函数声明,则隐式声明默认构造函数。 顶级类,成员类或本地类的默认构造函数的forms如下:

默认构造函数具有与类相同的可访问性(第6.6节)。

默认构造函数没有forms参数,除非在非私有内部成员类中,默认构造函数隐式声明一个forms参数,表示该类的直接封闭实例(§8.8.1,§15.9.2,§15.9.3) )。

默认构造函数没有throws子句。

如果声明的类是原始类Object ,则默认构造函数具有空体。 否则,默认构造函数只调用不带参数的超类构造函数。

注意最后一段。

所有没有任何显式超类的Java类都从Object扩展,但Object本身除外。 没有必要在代码中明确说明,编译器会处理。

此外,构造函数中的super()调用将调用Object的构造函数。 如果你看一下实现,你会发现Object根本没有任何构造函数,所以它将使用一个隐式的空构造函数,它什么都不做。 诸如构造vtable以确保inheritance的方法可以使用或初始化对象的监视器等细节不是构造函数的一部分,而是在调用new运算符时由JVM实现执行。

 public Object() { } 

Object类几乎没有在大多数类中派上用场的方法。 例如,臭名昭着的toString()是在Object类中实现的。 此外, hashCode()在那里实现。

我建议您深入了解Object.class文件,以了解每个Java类中inheritance的方法。

关于你在顶部的3条规则,对于学术目的来说是“好的”但从未在现实中使用过。 您永远不会看到显式extends Object ,只在需要覆盖默认行为时调用super()this()

此外,避免滥用inheritance并使用更多组合(实现接口),但这取决于每个用例。

例如,我有以下代码(我明确地扩展到Object并调用super())。 我的问题是,super()的调用是做什么的?

实际上, Object()什么都不做。
现在,您不应该减少约束以调用任何子类构造函数的super() (使用args或不使用args super() ,前提是您的类没有显式扩展类。

这种情况是唯一一个调用super()看起来不太有用的情况。
但是,一旦类扩展了与Object不同的类,这种约束就非常有意义,因为子构造必须首先应用其父构造。

但是语言以一般方式指明了这一点。 对于直接扩展Object类也没有例外。
可能是因为它使事情变得更简单,并且这不是真正的约束,因为编译器为您添加了对超级默认构造函数的调用: super()