Java中最终字段的继承?

Java中最终字段的继承?,java,inheritance,static,Java,Inheritance,Static,当一个超类有一个标记为final的字段,但一个子类覆盖(隐藏?)这个字段时会发生什么“决赛”并不能阻止这一切,是吗? 我正在处理的具体示例是一个Building类,不同类型的建筑从中继承。除其他外,每种类型的成本都应该是每个子类的最终成本,但每种类型的建筑都应该有自己的成本 编辑:后来我意识到我不知道我在说什么。我真正想要的是成本的静态变量。但是,如果我在超类中声明这些静态变量,它们对于超类是静态的,因此子类1.cost(例如)引用了与超类1.cost或子类2.cost相同的值。如何生成对每个子

当一个超类有一个标记为final的字段,但一个子类覆盖(隐藏?)这个字段时会发生什么“决赛”并不能阻止这一切,是吗? 我正在处理的具体示例是一个Building类,不同类型的建筑从中继承。除其他外,每种类型的成本都应该是每个子类的最终成本,但每种类型的建筑都应该有自己的成本


编辑:后来我意识到我不知道我在说什么。我真正想要的是成本的静态变量。但是,如果我在超类中声明这些静态变量,它们对于超类是静态的,因此子类1.cost(例如)引用了与超类1.cost或子类2.cost相同的值。如何生成对每个子类都是静态的变量,而不必在每个类中声明它们。

可以通过两种方法实现:生成访问器函数并隐藏字段本身,或者将构建成本从子类传递给超类构造函数。您可以将这些属性组合起来,生成子类无法覆盖的属性:

public class Building {
    private final int cost;

    protected Building(int cost, ...) {
        this.cost = cost;
    }

    public final int getCost() {
        return cost;
    }
}

public class Cottage extends Building {
    public Cottage() {
        super(COTTAGE_COST, ...);
    }
}

当应用于Java类的字段时,
final
关键字与继承无关。相反,它表示在构造函数之外,无法重新分配该字段

Java将名称隐藏和重写分开处理。重写实际上通过切换调用哪个函数来更改程序在运行时的可观察行为,而名称隐藏通过更改引用哪个字段的静态解释来更改程序<应用于重写的code>final仅适用于方法,因为Java中的字段不能被重写。不幸的是,在这些不同的上下文中使用
final
有点令人困惑,并且没有办法防止字段的名称隐藏在子类中

如果希望建筑物具有不同的成本,一个选项是使用一个重写的
getCost
方法,该方法在每个派生类中被不同地重写。或者,您可以在存储成本的基类中有一个
受保护的
私有的
字段,然后让每个子类直接(如果这是
受保护的
)或通过基类构造函数(如果这个字段是
私有的
)设置该字段


希望这有帮助

同意其他答案,但我认为在这种情况下,以下实施方式更好:

    public abstract class Building {

        private final int cost;

        public Building(int cost) {
            this.cost = cost;
        }

        public final int getCost() {
            return cost;
        }
    }

    class Skyscraper extends Building {
        public Skyscraper() {
            super(100500);
        }
    }

当然,该领域可以公开,但那是另一回事…

成本会不时变化,对吗?为什么要定下来呢。我认为隐藏一个字段不是一个好主意。所以你是说在超类中创建受保护的字段,然后在子类构造函数中自动为其分配不同的值?听起来很合理。@编辑器-如果您放弃字段的
final
修饰符,这将起作用。如果字段是
final
,则不能在子类构造函数中为其分配不同的值。相反,子类构造函数必须将值传递给要赋值的超类构造函数(如我在回答中所示)。如果超类没有在其构造函数中赋值,代码将不会编译;如果子类构造函数试图从超类中设置
final
字段的值,则代码将无法编译。@templatetypedef“它表示在构造函数之外,无法重新分配该字段”实际上并不正确:即使在构造函数中,也无法重新分配final字段。正因为如此,子类构造函数不能像Ted Hopp所说的那样重写超类的最终字段。