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吗?
答案 0 :(得分:1)
我们可以通过两种方式初始化常量,第一种是将它们初始化为与Adam在答案中相同的行,第二种是使用构造函数,这是您尝试实现的。
使用内联初始化通常更灵活,因为我们没有绑定构造函数的规则,如b
或a
调用应该是构造函数中的第一个。但是,如果您确实想要使用构造函数,则可以使用包含逻辑的方法作为内联调用作为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);
}
}