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",即使它是在构造函数中完成的。