当我们创建任何对象时,它将创建一个默认构造函数并调用super()
示例:
Parent(){
super();
}
但是当我查看Object类时,它没有构造函数,在调用super()构造函数时会发生什么。
似乎JVM调用方法在Object类中根本不存在,但无法理解发生了什么。
答案 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,那么 默认构造函数有一个空体。否则,默认 构造函数只调用没有的超类构造函数 参数。