Как определить константы/конечные переменные в абстрактных суперклассах, но назначить их в подклассе?

У меня есть абстрактный класс, где я хочу объявить конечные переменные.

Однако я хочу присвоить значения этим переменным только в конструкторах моих подклассов.

По-видимому, это невозможно, потому что все "окончательные поля должны быть инициализированы". Я не понимаю, почему, поскольку невозможно создать экземпляр абстрактного класса.

То, что я хотел бы иметь, выглядит примерно так:

abstract class BaseClass {
    protected final int a;
}

class SubClass extends BaseClass {
    public SubClass() {
        a = 6;
    }
}

Я представляю что-то подобное методам при реализации интерфейса. Затем вам также необходимо реализовать методы в классе (sub).

Ответ 1

Вы должны определить конструктор в своем абстрактном классе, который принимает значение для a и вызывает этот конструктор из ваших подклассов. Таким образом, вы гарантируете, что ваш последний атрибут всегда инициализируется.

abstract class BaseClass {
    protected final int a;

    protected BaseClass(int a)
    {
        this.a = a;
    }
}

class SubClass extends BaseClass {
    public SubClass() {
        super(6);
    }
}