为什么不允许从子类构造函数设置受保护的最终字段?
示例:
class A {
protected final boolean b;
protected A() {
b = false;
}
}
class B extends A {
public B() {
super();
b = true;
}
}
我觉得在某些情况下会有意义,不是吗?
答案 0 :(得分:6)
这是因为你不能改变最终字段的值。
但如果你真的想把它变成不同的价值,你可以这样做:
class A {
protected final boolean b;
protected A() {
this(false);
}
protected A(boolean b) {
this. b = b;
}
}
class B extends A {
public B() {
super(true);
}
}
答案 1 :(得分:1)
无法完成,因为final
字段的定义是它只能分配一次。如果A()
已经分配了受保护字段,则在B()
中再次分配该字段仍然会违反"只有一次",即使它已在构造函数中完成。