Java 为什么不允许从子类构造函数设置受保护的最终字段?
Java Why isn't it allowed to set a protected final field from a subclass constructor?
为什么不允许从子类构造函数设置受保护的最终字段?
示例:
class A {
protected final boolean b;
protected A() {
b = false;
}
}
class B extends A {
public B() {
super();
b = true;
}
}
我认为在某些情况下这很有意义,不是吗?
这是因为您无法更改最终字段的值。
但是如果你真的想把它设置成不同的值,你可以这样做:
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);
}
}
做不到,因为final
字段的定义是只能赋值一次。如果 A()
已经分配了受保护的字段,在 B()
中再次分配它仍然违反 "only once",即使它是在构造函数中完成的。
为什么不允许从子类构造函数设置受保护的最终字段?
示例:
class A {
protected final boolean b;
protected A() {
b = false;
}
}
class B extends A {
public B() {
super();
b = true;
}
}
我认为在某些情况下这很有意义,不是吗?
这是因为您无法更改最终字段的值。
但是如果你真的想把它设置成不同的值,你可以这样做:
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);
}
}
做不到,因为final
字段的定义是只能赋值一次。如果 A()
已经分配了受保护的字段,在 B()
中再次分配它仍然违反 "only once",即使它是在构造函数中完成的。