class p {
p(){
System.out.println("1");
}
}
class Student extends p{
Student() {
super();
System.out.println("2");
}
public static void main(String[] args) {
Student s = new Student();
}
}
由于我已经明确地提供了super(),但在使用jd-gui进行反编译之后,我无法看到我放置的super(),因为super()应该由编译器本身提供。我只是想看看这个,super关键字和其他东西是由编译器隐式提供的。我用Google搜索并发现.class文件我可以用jd-gui看到,但是我无法看到super()和this(),有没有其他相同的方法?
答案 0 :(得分:6)
在Java中,任何不以明确的super(...)
或this(...)
链接构造函数调用开头的构造函数都将自动获取(等效的字节码)super();
作为其第一条指令插入编译器。因此,当反编译器在构造函数的开头看到super()
的字节码时,它无法知道原始源代码是否包含显式super()
或者指令是否是由编译器隐式插入的。两个版本都编译为相同的字节码,因此没有特别的理由让它更喜欢一个字节码。
答案 1 :(得分:1)
无论如何,在反编译代码中都会调用隐式构造函数super()
。
Class A extends B {
public A() {
super(); // this is called whether you put it here or not
}
}