Java要求如果在构造函数中调用this()或super(),它必须是第一个语句.为什么?
例如:
public class MyClass {
public MyClass(int x) {}
}
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
int c = a + b;
super(c); // COMPILE ERROR
}
}
Run Code Online (Sandbox Code Playgroud)
Sun编译器说"调用super必须是构造函数中的第一个语句".Eclipse编译器说"构造函数调用必须是构造函数中的第一个语句".
但是,您可以通过重新安排代码来解决这个问题:
public class MySubClass extends MyClass {
public MySubClass(int a, int b) {
super(a + b); // OK
}
}
Run Code Online (Sandbox Code Playgroud)
这是另一个例子:
public class MyClass {
public MyClass(List list) {}
}
public class MySubClassA extends MyClass {
public MySubClassA(Object item) {
// Create a list …Run Code Online (Sandbox Code Playgroud) 我想知道在分析构造函数的字节码时是否有一种明显而快速的方法,以确定super()代码的结束位置.
更具体地说,与Java形成鲜明对比的是,构造函数中对任何super()构造函数方法的调用是可选的(或者更确切地说,当不存在时 - 隐式),在字节码世界中始终需要它.
出于黑魔法的目的,我需要通过字节码分析和最简单的方法来了解INVOKESPECIAL,与Java世界的super()调用相对应的调用是什么.
我会带着一个很难的例子离开这里:
public static class A {
public A(Object o, Object b) {
}
}
public static class B extends A {
public B() {
//the below super is in bold just to signal that's the one
//I'm looking for
SUPER(new A(new Object(), new Integer(2)), new Integer(1));
System.out.println(new A(new Object(), new Integer(2)));
}
}
Run Code Online (Sandbox Code Playgroud)
使用相应的字节码:
