Java .class文件没有';t显示对父对象的调用';s构造函数
我试图理解java中的构造函数。我读到,如果我没有在java文件中提供构造函数,编译器将为我插入一个(默认为no-args-one)。我编写了一个简单的java文件ConstructorTest.java,如下所示Java .class文件没有';t显示对父对象的调用';s构造函数,java,constructor,Java,Constructor,我试图理解java中的构造函数。我读到,如果我没有在java文件中提供构造函数,编译器将为我插入一个(默认为no-args-one)。我编写了一个简单的java文件ConstructorTest.java,如下所示 public class ConstructorTest{ } 然后我编译了它,使用Cavaj,我可以看到类文件的内容,如下所示 public class ConstructorTest { public ConstructorTest() { } } 我
public class ConstructorTest{
}
然后我编译了它,使用Cavaj,我可以看到类文件的内容,如下所示
public class ConstructorTest
{
public ConstructorTest()
{
}
}
我的问题是,对于下面的语句,我看不到同样的情况,“如果您键入自己的构造函数,并且没有键入对super()
或this()
的调用,编译器将插入对super()
的无参数调用,作为构造函数中的第一条语句(摘自oracleoca/OCP
java7学习指南)”
我的java文件:
public class ConstructorChild extends ConstructorTest{
public ConstructorChild(){
}
}
我的类文件:
public class ConstructorChild extends ConstructorTest
{
public ConstructorChild()
{
}
}
为什么要调用
super()编译时编译器不会插入
?感谢您的帮助。Erwin Bolwidt是对的。顺便说一句,java字节码中的构造函数总是被命名为
,而静态块称自己为
。另外请注意,后者可能会出现多次,JVM会按出现的顺序调用它们加载类。Erwin Bolwidt是正确的。顺便说一句,java字节码中的构造函数总是被命名为
,而静态块称自己为
。还要注意,后者可能会出现多次,JVM会在加载类时按出现的顺序调用所有构造函数。您应该告诉我们如何“读取”.class
文件您显示的不是.class文件,而是另一个Java源文件。您能更清楚地说明您的问题吗?您好@ErwinBolwidt,当我提到class文件时,它是我在.class文件中看到的内容,当使用Cavaj打开时。我的问题是为什么编译器没有插入“super()”作为编译文件的第一行,当我自己在java文件中提供构造函数时,如第二个示例.Hi@RC.所示,我使用Cavaj(免费java反编译器之一)打开.class文件。@Chetan那么答案很简单:因为Cavaj不显示对super()的隐式调用
,因为它是可选的。它是可选的,因为编译器会自动插入它。如果你真的想知道发生了什么,你需要使用javap
并查看字节码(你需要研究一下字节码),你应该告诉我们你是如何“读取”的.class
文件您显示的不是.class文件,而是另一个Java源文件。您能更清楚地说明您的问题吗?您好@ErwinBolwidt,当我提到class文件时,它是我在.class文件中看到的内容,当使用Cavaj打开时。我的问题是为什么编译器没有插入“super()”作为编译文件的第一行,当我自己在java文件中提供构造函数时,如第二个示例.Hi@RC.所示,我使用Cavaj(免费java反编译器之一)打开.class文件。@Chetan那么答案很简单:因为Cavaj不显示对super()的隐式调用
,因为它是可选的。它是可选的,因为编译器会自动插入它。如果你真的想知道发生了什么,你需要使用javap
并查看字节码(你需要研究一下字节码)