Почему нужен защищенный конструктор в абстрактном классе в Java - PullRequest
2 голосов
/ 09 июля 2019

При просмотре Java-кода я видел, что конструктор абстрактного класса сделан защищенным.

public abstract class A {
   protected A() {

   }
}

Что

Аннотация означает для меня, что вы не можете создать экземпляр этого Класс и использовать этот класс после расширения

.

И защищенный конструктор также обеспечивает это.

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

Ответы [ 2 ]

2 голосов
/ 09 июля 2019

Это правда, что уменьшение видимости конструктора в абстрактном классе (с public до protected) ничего не меняет в отношении неспособности кода непосредственно создавать экземпляр абстрактного класса.

Однако дело не в этом. Один делает конструктор protected просто для управления областями, точно так же, как один делает свойства элемента закрытыми.

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

public abstract class A {
    protected A() {
        this(0);
    }
    private A(int a) {
        // not accessible to anyone but members of A
        // the point is not to prevent instantiation, but to restrict access
    }
}

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

1 голос
/ 09 июля 2019

Создание конструктора protected не мешает другим классам из того же пакета или другим классам, расширяющим этот класс, создавать экземпляр класса с помощью этого конструктора.Поэтому ключевое слово abstract требуется для предотвращения создания экземпляров.

Вы можете объявить конструктор класса abstract как public, но вы все равно не сможете создать экземпляр этого класса, так что это бессмысленно,С другой стороны, конструктор private не будет использоваться подклассами вашего класса abstract (будут только другие конструкторы самого класса abstract).Следовательно, любой конструктор класса abstract, который должен быть доступен для всех подклассов класса abstract, должен иметь вид protected.

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

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