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) 我有一个构造函数,它获取HashSet和HashMap.我需要在一个hashMAp上运行验证检查并将其与hashSet结合使用,因为'super'必须只接收一个hashSet.因为我得到以下错误,我无法找到方法:cannot reference this before supertype constructor
例:
public class A extends B {
public A(HashSet<Obj> h1, HashMap<UID,Objects> m1) {
super(new C (h1) ); //h1 should contain changes related to m1..
}
Run Code Online (Sandbox Code Playgroud)
我想做那样的事情:
public class A extends B {
public A(HashSet<Obj> h1, HashMap<UID,Objects> m1) {
runMyFunc(h1,m1);
super(new C (h1) );
}
runMyFunc(HashSet<Obj> h1, HashMap<UID,Objects> m1){
//do checks
//more checks...
// if something then h1.setUid(m1.get(0))...
return h1;
}
Run Code Online (Sandbox Code Playgroud)
我想将构造函数转换为私有,然后像这样运行它:
public class A extends B {
private A(HashSet<Obj> h1) {
super(new C …Run Code Online (Sandbox Code Playgroud)