在Object类的构造函数,会发生什么

问题描述:

当我们创建的任何对象时,它会创建一个默认的构造函数,并调用超()在Object类的构造函数,会发生什么

例如:

Parent(){ 
     super(); 
    } 

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

似乎JVM调用方法这是根本不存在的对象类,但不能够明白发生了什么。

+2

java.lang.Object'的大部分实现都是原生的。 – Mena

+0

你在看源代码还是类文件? java编译器会将一个空的构造函数插入到Object类文件中,就像它处理你的Parent类一样。 – SamTebbs33

+0

感谢@Mena的快速回复:) 我们可以得到更多关于这方面的信息/链接,本地实现中发生了什么。 – Sravan

Object执行中的每个实例一些本地操作。

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

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

+0

感谢@ jfcorugedo的快速回复:)我们可以获得更多关于这方面的信息/链接,本地实现中发生了什么。 – Sravan

+1

嗯,它取决于每个JVM,但基本上它为此对象分配足够的内存 – jfcorugedo

Object类本机方式大多实现,这样的构造不调用它的父。此外,它没有任何父类,因为它被设置为.class文件中的null。你可以在java .class file format阅读更多有关如何存储Java类的内容。

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

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

JVM如何调用这个<init>方法?

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

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

没有什么比在默认的空构造函数的子类中(减去对super()的调用)会发生。

默认构造函数可以被明确定义,如果没有编译器就会把它在为你只要没有其他构造函数已定义。

欲了解更多信息,看看JVM规范和Java语言规范:

而所有其他的答案关于本地代码是真的,在形式上没有什么特别的或神秘的关于java.lang.Object明显缺乏构造函数。

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

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

哪里Object不同是什么,默认的构造函数包含:

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