Может ли абстрактный класс иметь конструктор?

565
задан Community 17 October 2016 в 13:41
поделиться

5 ответов

Да, абстрактный класс может иметь конструктора. Рассмотрите это:

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 имеет конструктора, который позволяет вызывающей стороне определять значение.

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

ПРИМЕЧАНИЕ: Как нет никакого значения по умолчанию (или без аргументов) конструктор в родительском абстрактном классе, конструктор, используемый в подклассе, должен явно вызвать родительского конструктора.

603
ответ дан rimsky 17 October 2016 в 13:41
поделиться

Рассмотрите это:

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;
    }
}

суперкласс абстрактен и имеет конструктора.

2
ответ дан S.Lott 17 October 2016 в 13:41
поделиться

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

55
ответ дан Lawrence Dol 17 October 2016 в 13:41
поделиться

Вы определили бы конструктора в абстрактном классе, если Вы находитесь в одной из этих ситуаций:

  • Вы хотите выполнить некоторую инициализацию (к полям абстрактного класса), прежде чем инстанцирование подкласса на самом деле произойдет
  • , Вы определили заключительные поля в абстрактном классе, но Вы не инициализировали их в самом объявлении; в этом случае у Вас ДОЛЖЕН быть конструктор для инициализации этих полей

Примечание что:

  • можно ли определить больше чем одного конструктора (с различными аргументами)
  • , Вы можете (должен?) определяют всех Ваших защищенных конструкторов (обнародовать их бессмысленно так или иначе)
  • , Ваш конструктор (конструкторы) подкласса может вызвать одного конструктора абстрактного класса; это может даже иметь к вызов это (если нет никакого конструктора без аргументов в абстрактном классе)

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

149
ответ дан jfpoilpret 17 October 2016 в 13:41
поделиться

пакет 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;
    }

}
0
ответ дан 22 November 2019 в 22:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: