Я хотел бы знать, какой цели конструктор для абстрактного класса служит; поскольку мы не инстанцируем абстрактных классов, почему нам когда-либо был бы нужен такой конструктор?
Будут времена, когда у вас есть некоторая общая инициализация переменных экземпляров, которые необходимо настроить все наследующие классы. Вы создаете экземпляр абстрактного класса, когда вы продвигаете его, и этот бетонный класс имеет конструктор, который будет поставлять параметры конструктору абстрактного класса.
Если у вас есть неинициализированные финальные поля в абстрактном классе, вам нужно инициатировать их в конструкторе.
E.G.
abstract class A {
final int x;
}
не будет компилировать без конструктора, который присваивается x
.
Они все еще могут быть вызваны конструкторами классов, которые наследуют от этого, делая рефактирование кода хорошее использование для того, чтобы иметь конструктор в абстрактном классе.
Если ваш класс не объявляет конструктор, Javac сделает BOR ARG, сделать ничего особенного для вас. Затем, когда ваш подкласс инициализируется, он позвонит сгенерированному конструктору NO-OP, а жизнь хорошая.
Однако, если ваш класс объявляет какой-либо конструктор, Javac не сделает для вас. В этом случае конструктор подкласса требует явным вызове конструктора родительского класса. В противном случае вы не будете инициализировать членов родительского класса, так как приведенный выше ответ упоминается.
Конструкторы для абстрактных классов используются подклассами (вызываются из конструкторов подкладки с использованием Super (Params)
).
Вы должны сделать эти конструкторы , защищенные
, чтобы сделать это понятно.
Вы не создаете экземпляры абстрактных классов, но конструктор вызывается при создании подкласса.
Использование может быть инициализировать общие атрибуты, т.е.
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]
Дублирование общего знания / поведения.
E.g. Автомобиль: все ваши машины будут построены из тела и четыре колеса и двигатель.Таким образом, вы выполняете эту часть конструкции в конструкторе для класса абстрактных автомобилей, вызывая функции, такие как тело (), колесо (INT X), двигатель (). Каждый конкретный класс автомобиля будет иметь собственную реализацию тела (), колеса () и двигателя () - но все они сделают те же шаги, чтобы построить машину от них, поэтому нет необходимости дублировать эти шаги в каждом из них классы. В этом случае вы реализуете это общее поведение в предке.
Согласен, строители создаются при условии, что будут случаи. Если у вас много общего кода, то вы можете подумать о создании конструктора, но гораздо лучше поместить его в метод init()
.