subClass中的最终变量初始化

时间:2017-11-02 14:49:49

标签: java

public class A {

    final int  x;

    public A(int x) {
        if ( this instanceof B ) {
            if(x > 5)
                this.x = x;
            else
                this.x = 0;
        } else {
            this.x = 0;
        }

    }   
}

public class B extends A {

    public B(int x) {
        super(x); 
    }
}

我想在类B中放置if以避免instanceof(因为我有更多的子类,x值取决于subClass),但是当我这样做时,我得到编译器错误:构造函数调用必须是第一个语句在构造函数中!

你能帮我避免使用instanceof吗?

2 个答案:

答案 0 :(得分:1)

我们可以通过两种方式初始化常量,第一种是将它们初始化为与Adam在答案中相同的行,第二种是使用构造函数,这是您尝试实现的。

使用内联初始化通常更灵活,因为我们没有绑定构造函数的规则,如ba调用应该是构造函数中的第一个。但是,如果您确实想要使用构造函数,则可以使用包含逻辑的方法作为内联调用作为this(...)的参数。这个方法应该是super(...),因为我们在构造函数中还没有存在类的实例。以下是一个简单的解决方案。

this(...) or super(...)

答案 1 :(得分:0)

只需在abstract中创建A方法,然后在派生类中实现,如下所示:

public abstract class A {

    final int x;

    abstract int calculateX(int x);

    public A(int x) {
        this.x = calculateX(x);
    }
}

public class B extends A {

    @Override
    int calculateX(int x) {
        return x + 1;
    }

    public B(int x) {
        super(x);
    }
}