Какая польза от создания конструктора для абстрактного класса в Java? - PullRequest
7 голосов
/ 21 января 2010

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

Ответы [ 8 ]

9 голосов
/ 21 января 2010

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

5 голосов
/ 21 января 2010

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

3 голосов
/ 21 января 2010

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

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

3 голосов
/ 21 января 2010

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

* 1003 Е.Г. *

abstract class A {
    final int x;
}

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

2 голосов
/ 21 января 2010

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

Можно использовать для инициализации общих атрибутов, т. Е.

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]
2 голосов
/ 21 января 2010

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

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

1 голос
/ 21 января 2010

Дедупликация общих знаний / поведения.

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

0 голосов
/ 21 января 2010

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

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