我正在尝试扩展一个类,以在实现上略有不同。现在,该父类中有一个最终变量为:
private final float mIndicatorItemLength = DP * 4;
是在类级别定义的,我想从子类为该变量提供自定义值。由于此变量是最终变量,因此我将其更改为从构造函数初始化。我在这里有两个构造函数:
public HorizontalCirclePagerIndicatorDecoration()
引用为:
public HorizontalCirclePagerIndicatorDecoration() {
mIndicatorItemLength = DP * 4;
}
和
public HorizontalCirclePagerIndicatorDecoration(int colorActive, int colorInactive, int mIndicatorItemLength)
第一个构造函数是默认的,第二个构造函数是我想从子类访问的,并使用子类的super关键字设置自定义值,例如:
public TPagerIndicator(int colorActive, int colorInactive) {
super(colorActive, colorInactive, mIndicatorItemLength);
}
我的孩子班级签名如下:
TPagerIndicator extends HorizontalCirclePagerIndicatorDecoration
但是我在这里遇到错误,因为:在超类型构造函数被调用之前无法引用TPagerIndicator.mIndicatorItemLength
。
现在我想我必须删除
上的最终修饰符private final float mIndicatorItemLength = DP * 4;
在父类中。这是正确的方法吗?
答案 0 :(得分:1)
这是正确的方法。如您所知,子类必须至少调用一个超类构造函数。在Java中,不允许使用尚未初始化的最终属性(mIndicatorItemLength
)。
class HorizontalCirclePagerIndicatorDecoration {
...
private final float mIndicatorItemLength;
HorizontalCirclePagerIndicatorDecoration() {
mIndicatorItemLength = DP * 4;
}
HorizontalCirclePagerIndicatorDecoration(
final int colorActive,
final int colorInactive,
final int mIndicatorItemLength) {
...
this.mIndicatorItemLength = mIndicatorItemLength;
}
...
}
class TPagerIndicator extends HorizontalCirclePagerIndicatorDecoration {
TPagerIndicator(
final int colorActive,
final int colorInactive) {
super(colorActive, colorInactive, 12.3F /* Explicit set */);
}
TPagerIndicator(
final int colorActive,
final int colorInactive
final int mIndicatorItemLength) {
super(colorActive, colorInactive, mIndicatorItemLength /* Input set */);
}
...
}