【问题标题】:Java Why isn't it allowed to set a protected final field from a subclass constructor? [duplicate]Java 为什么不允许从子类构造函数中设置受保护的最终字段? [复制]
【发布时间】:2017-01-01 05:55:39
【问题描述】:

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

例子:

class A {
    protected final boolean b;

    protected A() {
        b = false;
    }
}

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

我认为这在某些情况下是有意义的,不是吗?

【问题讨论】:

  • final 字段只能在构造函数或类的初始化过程中进行初始化。

标签: java constructor subclass final protected


【解决方案1】:

这是因为您无法更改最终字段的值。

但如果你真的想将它设置为不同的值,你可以这样做:

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);
    }
}

【讨论】:

  • 我说的是构造函数。
  • @stonar96 你在调用超类的构造函数时设置了b 的值。如果要在子类中将其设置为不同的值,则需要将该值传递给超类构造函数。
【解决方案2】:

不能这样做,因为final字段的定义是只能赋值一次。如果A() 已经分配了受保护的字段,在B() 中再次分配它仍然违反“仅一次”,即使它是在构造函数中完成的。

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 2018-09-10
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多