我的代码就像这样
public class B {
public B(int f) {
}
}
public class A extends B{
int f=4;
public A() {
super(f);
}
}
为什么会出现编译错误?
答案 0 :(得分:0)
为了创建A类的实例,Java的行为就像 first 创建B的实例一样,这意味着将调用超类的构造函数super(), (或者在这种情况下,你自己称呼)和然后“添加”A类的属性。 这也是为什么super()调用必须始终是构造函数中的第一条指令的原因。
你试图传递一个参数,在某种意义上它还不存在,因为你试图在之前读取你被称为super()的f 。
您可以做的是:
public class A extends B {
static final int F_CONST = 4;
int f = F_CONST;
public A() {
super(F_CONST);
}
}
这里F_CONST是一个常量“静态”变量,它是一个“类变量”,而不是“对象或实例变量”。当类在内存中加载时,将初始化静态成员,这是在调用任何构造函数之前。甚至允许编译器直接用值4替换F_CONST,这也是一个简单的解决方案。