喜欢超级延伸

时间:2012-04-01 14:57:37

标签: constructor extends super

我的代码就像这样

public class B {
    public B(int f) {

    }

}


public class A extends B{

    int f=4;
    public A() {
        super(f);
    }

}

为什么会出现编译错误?

1 个答案:

答案 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,这也是一个简单的解决方案。