Да, абстрактный класс может иметь конструктора. Рассмотрите это:
abstract class Product {
int multiplyBy;
public Product( int multiplyBy ) {
this.multiplyBy = multiplyBy;
}
public int mutiply(int val) {
return multiplyBy * val;
}
}
class TimesTwo extends Product {
public TimesTwo() {
super(2);
}
}
class TimesWhat extends Product {
public TimesWhat(int what) {
super(what);
}
}
суперкласс Product
абстрактен и имеет конструктора. Реальный класс TimesTwo
имеет конструктора что просто hardcodes значение 2. Реальный класс TimesWhat
имеет конструктора, который позволяет вызывающей стороне определять значение.
Абстрактные конструкторы будут часто использоваться для осуществления ограничений класса или инвариантов, таких как минимальные поля, требуемые устанавливать класс.
ПРИМЕЧАНИЕ: Как нет никакого значения по умолчанию (или без аргументов) конструктор в родительском абстрактном классе, конструктор, используемый в подклассе, должен явно вызвать родительского конструктора.
Рассмотрите это:
abstract class Product {
int value;
public Product( int val ) {
value= val;
}
abstract public int multiply();
}
class TimesTwo extends Product {
public int mutiply() {
return value * 2;
}
}
суперкласс абстрактен и имеет конструктора.
Да это может иметь конструктора, и это определяется и ведет себя точно так же, как конструктор любого другого класса. За исключением того, что абстрактные классы нельзя непосредственно инстанцировать, только расширенные, таким образом, использование поэтому всегда от конструктора подкласса.
Вы определили бы конструктора в абстрактном классе, если Вы находитесь в одной из этих ситуаций:
Примечание что:
В любом случае, не забывайте, что, если Вы не определяете конструктора, тогда компилятор автоматически генерирует один для Вас (этот общедоступен, не имеет никакого аргумента, и ничего не делает).
пакет Test1;
общедоступный класс AbstractClassConstructor {
public AbstractClassConstructor() {
}
public static void main(String args[]) {
Demo obj = new Test("Test of code has started");
obj.test1();
}
}
abstract class Demo{
protected final String demoValue;
public Demo(String testName){
this.demoValue = testName;
}
public abstract boolean test1();
}
class Test extends Demo{
public Test(String name){
super(name);
}
@Override
public boolean test1() {
System.out.println( this.demoValue + " Demo test started");
return true;
}
}