在Object类的构造函数,会发生什么
当我们创建的任何对象时,它会创建一个默认的构造函数,并调用超()在Object类的构造函数,会发生什么
例如:
Parent(){
super();
}
,但是当我看向Object类没有构造函数在它中,调用super()构造函数时会发生什么。
似乎JVM调用方法这是根本不存在的对象类,但不能够明白发生了什么。
类Object
执行中的每个实例一些本地操作。
Java编译器保证每一个对象创建调用Object
构造。
这就是为什么每个构造函数必须以super()
或this()
调用开始的原因。因此,在每个实例中执行的第一个构造函数将是Object
构造函数。
感谢@ jfcorugedo的快速回复:)我们可以获得更多关于这方面的信息/链接,本地实现中发生了什么。 – Sravan
嗯,它取决于每个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语言规范:
- 特殊的方法(JVM) - JVMS - 2.9
- 构造 - JLS - 8.8
而所有其他的答案关于本地代码是真的,在形式上没有什么特别的或神秘的关于java.lang.Object
明显缺乏构造函数。
任何缺少明确定义的构造函数的类都将自动收到default constructor。例如,这是有效的代码:
class Foo {}
class Bar extends Foo {
public Bar(String baz) {
super();
}
}
哪里Object
不同是什么,默认的构造函数包含:
如果所声明的类是原始类的对象,那么 默认的构造函数有一个空身体。否则,构造函数的默认构造函数只会调用没有参数 的超类构造函数。
java.lang.Object'的大部分实现都是原生的。 – Mena
你在看源代码还是类文件? java编译器会将一个空的构造函数插入到Object类文件中,就像它处理你的Parent类一样。 – SamTebbs33
感谢@Mena的快速回复:) 我们可以得到更多关于这方面的信息/链接,本地实现中发生了什么。 – Sravan