Object类构造函数中会发生什么

时间:2015-11-06 14:10:37

标签: java constructor default-constructor

当我们创建任何对象时,它将创建一个默认构造函数并调用super()

示例:

    Parent(){
        super();
    }

但是当我查看Object类时,它没有构造函数,在调用super()构造函数时会发生什么。

似乎JVM调用方法在Object类中根本不存在,但无法理解发生了什么。

4 个答案:

答案 0 :(得分:1)

Object在每个实例中执行一些本机操作。

Java编译器保证每个对象都创建调用Object构造函数。

这就是为什么每个构造函数都必须以super()this()调用开始的原因。因此,在每个实例中执行的第一个构造函数将是Object构造函数。

答案 1 :(得分:1)

Object类主要以本机方式实现,因此构造函数不会调用其父级。此外,它没有任何父类,因为它在null文件中设置为.class。您可以在java .class file format阅读有关Java类存储方式的更多信息。

Java语言本身不允许这样的技巧,但VM允许它们,对于每个内部类文件,验证都被禁用。

答案 2 :(得分:1)

对象的创建由JVM决定。 Java中的每个构造函数都显示为一个名为<init>的特殊方法,它负责实例初始化。此<init>方法由编译器提供,因为<init>不是Java中的有效标识符,所以不能直接在该语言中使用。

  

JVM如何调用此<init>方法?

JVM将使用<init>指令调用invokespecial方法,并且只能在未初始化的类实例上调用。

  

Object类构造函数会发生什么?

只有具有默认空构造函数的子类(减去对super()的调用)才会发生。

默认构造函数可以显式定义,如果没有,只要没有定义其他构造函数,编译器就会把它放在那里。

有关更多信息,请参阅JVM规范和Java语言规范:

答案 3 :(得分:1)

虽然关于本机代码的所有其他答案都是正确的,但正式地说java.lang.Object明显缺乏构造函数并没有什么特别或神秘的。

任何缺少明确定义的构造函数的类都将自动收到default constructor。这是有效的代码,例如:

class Foo {}
class Bar extends Foo {
   public Bar(String baz) {
      super();
   }
}

Object不同的是默认构造函数包含的内容:

  

如果声明的类是原始类Object,那么   默认构造函数有一个空体。否则,默认   构造函数只调用没有的超类构造函数   参数。