Java为什么不允许从子类构造函数设置受保护的最终字段?

时间:2016-08-24 23:23:31

标签: java constructor subclass final protected

为什么不允许从子类构造函数设置受保护的最终字段?

示例:

class A {
    protected final boolean b;

    protected A() {
        b = false;
    }
}

class B extends A {
    public B() {
        super();
        b = true;
    }
}

我觉得在某些情况下会有意义,不是吗?

2 个答案:

答案 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()中再次分配该字段仍然会违反"只有一次",即使它已在构造函数中完成。