Какой смысл создавать конструктор для абстрактного класса в Java?

Я хотел бы знать, какой цели служит конструктор для абстрактного класса; поскольку мы не создаем экземпляры абстрактных классов, зачем нам вообще нужен такой конструктор?

8 ответов


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


Они все еще могут вызываться конструкторами классов, которые наследуют от этого, что делает рефакторинг кода хорошим использованием для наличия конструктора в абстрактном классе.


Если у вас есть неинициализированные конечные поля в абстрактном классе, вам нужно будет инициализировать их в конструкторе.

Э. Г.

abstract class A {
    final int x;
}

не будет компилироваться без конструктора, который назначает x.


Если ваш класс не объявляет конструктор, javac сделает для вас конструктор no-arg, do-nothing. Затем, когда ваш подкласс инициализирован, он вызовет сгенерированный конструктор no-op, и жизнь хороша.

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


конструкторы для абстрактных классов используются подклассами (вызываются из конструкторов подклассов с помощью super(params) ).

вы должны сделать эти конструкторы protected чтобы внести ясность.


вы не создаете абстрактные классы, но конструктор вызывается при создании экземпляра подкласса.

использование может быть для инициализации общих атрибутов ie.

import java.util.List;
import java.util.ArrayList;
abstract class BaseClass {
    protected List list; // visible from subclasses

    public BaseClass() {
        System.out.println("to abstract...");
        // common initialization to all subclasses
        list = new ArrayList();
        list.add("a");
        list.add("a");
        list.add("a");
    }
}

class ConcreteClass extends BaseClass {
    public ConcreteClass(){
        // The list is initialized already
        System.out.println("now it is concrete and the list is: = "+ this.list );


    }
}

class TestAbstractClass {
    public static void main( String [] args ) {
        BaseClass instance = new ConcreteClass();
    }

}

выход

$ java TestAbstractClass
to abstract...
now it is concrete and the list is: = [a, a, a]

де-дублирование общих знаний / поведения.

Е. Г. автомобиля: все автомобили будут построены из тела и четырех колес и двигателя. Таким образом, Вы делаете эту часть конструкции в конструкторе для абстрактного класса автомобиля, вызывая такие функции, как Body (), Wheel(int x), Engine(). Каждый конкретный класс автомобилей будет иметь свою собственную реализацию Body (), Wheel() и Engine () - но все они будут делать те же шаги, чтобы построить автомобиль из них, поэтому нет необходимости дублировать эти шаги в каждом из этих классов. В этом случае вы реализуете это общее поведение в предке.


Я согласен, конструкторы создаются при условии, что будут экземпляры. Если у вас много общего кода, Вы можете подумать о создании конструктора, но гораздо лучше поместить его в init() метод.