Что использование создания является конструктором для абстрактного класса в Java?

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

7
задан Michael Myers 20 January 2010 в 23:17
поделиться

8 ответов

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

9
ответ дан 6 December 2019 в 07:26
поделиться

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

E.G.

abstract class A {
    final int x;
}

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

3
ответ дан 6 December 2019 в 07:26
поделиться

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

5
ответ дан 6 December 2019 в 07:26
поделиться

Если ваш класс не объявляет конструктор, Javac сделает BOR ARG, сделать ничего особенного для вас. Затем, когда ваш подкласс инициализируется, он позвонит сгенерированному конструктору NO-OP, а жизнь хорошая.

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

3
ответ дан 6 December 2019 в 07:26
поделиться

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

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

2
ответ дан 6 December 2019 в 07:26
поделиться

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

Использование может быть инициализировать общие атрибуты, т.е.

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
ответ дан 6 December 2019 в 07:26
поделиться

Дублирование общего знания / поведения.

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

1
ответ дан 6 December 2019 в 07:26
поделиться

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

-1
ответ дан 6 December 2019 в 07:26
поделиться
Другие вопросы по тегам:

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