-1, это тоже недопустимый синтаксис PHP, и вопрос был помечен Java

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

Есть ли обстоятельства, при которых этополезным объявить конструкторabstract класс бытьpublic, скорее, чемprotected или пакет-приват?

Это не совсем дубликат вопроса »Модификатор доступа к конструктору абстрактных классов": явно выМожно объявить конструкторpublic; Я хочу знать, есть ли когда-нибудьхороший причина для этого. Мне кажется, что нет. я вижу этоC # имеет похожую особенность.

 Sandeep Jindal28 июн. 2013 г., 20:05
Конструктор не имеет ничего общего с «созданием» объекта. Это просто метод, который вызывается при «создании» объекта. Таким образом, у класса Abstract могут быть открытые конструкторы, которые будут вызываться при создании экземпляра класса Abstract (через Subclass), и в этом конструкторе-методе вы должны написать код для инициализации переменных-членов.stackoverflow.com/questions/260666/...
 Brian McCutchon12 мар. 2014 г., 01:32
Конструкторы также могут бытьprivate, который можно использовать в цепочке конструктора.

Ответы на вопрос(4)

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

То есть: указать, как будут выглядеть параметры конструктора.

Укажите абстрактный конструктор (таким образом, делая класс абстрактным). Производные классы должны реализовать этот конструктор с его конкретной сигнатурой, чтобы потерять абстрактный статус.

Я не вижу другого способа указать обязательные сигнатуры конструктора (помогите, если вы это сделаете).

 Raedwald31 мар. 2014 г., 20:18
Вы не можете избежать звонкаsuper, Он вызывается неявно, если вы не вызываете его явно.
 foo15 мар. 2016 г., 03:44
дело не в том, чтобы не позвонитьsuper, дело в том, чтобы указать сигнатуру конструктора.
 foo31 мар. 2014 г., 19:55
истина, но для этого требуется, чтобы производный класс вызвал super () или рискует пропустить шаги инициализации, которые могут произойти. Аннотация уточняет, что это только подпись, без реализации. - Было бы лучше, если бы интерфейсы позволяли указывать сигнатуру конструктора. Но так как они этого не делают, я считаю абстрактные классы следующей лучшей вещью.
 Sean Van Gorder27 июн. 2016 г., 16:51
Просто чтобы уточнить, эта идея даже не работает.abstract не является допустимым модификатором для конструктора, вы делаете класс абстрактным, изменяя объявление класса. В Java нет способа назначать подписи конструктора для подклассов, они никогда не наследуются.
 Raedwald29 мар. 2014 г., 11:35
Создание конструктораprotected все еще позволяет вам "указать, как будут выглядеть параметры конструктора".
Решение Вопроса

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

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

Таким образом, добавление специального правила для модификаторов доступа конструкторов абстрактных классов не добавит что-то полезное для языка.

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

public abstract class A {
  public A() {}
}

public class B extends A {}

Таким образом, мы можем создатьB позвонив по телефонуnew B() - но учтите, что мыВсе еще создатьB и неA, И, опять же, не имеет значения, если конструктор вA является публичным или защищенным. Это просто не должно быть приватно, но компилятор заметит и пожалуется ...

На самом деле мы вызываем «невидимый» публичный конструктор по умолчанию наB который делает простойsuper() вызов...

если вы не определили его в подклассе. пример

abstract class Animal {
   String name;
   public void Animal(String name) {
         this.name = name;
   }
}


class Cat extends Animal{
    public String sayMayName() {
       return this.name;
    }
}
myCat = new Cat("tester");

name = myCat.sayMyName();

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

 biziclop25 янв. 2011 г., 15:22
Это будет работать только с конструктором без аргументов. Попробуйте, ваш код не скомпилируется. Но неявный конструктор по умолчанию всегда будет иметь видимость самого класса, независимо от того, что это за конструктор суперкласса.
 Andreas_D25 янв. 2011 г., 15:14
Это не скомпилируется - конструктортребуется вCat потому чтоAnimal имеет (не по умолчанию) конструктор (public void Animal(String name) все равно не конструктор)
 Kenny Cason01 апр. 2013 г., 21:40
-1, это тоже недопустимый синтаксис PHP, и вопрос был помечен Java
 Joachim Sauer25 янв. 2011 г., 15:12
Это не работает в Java. Кроме того, вы не определяете конструктор вAnimal класс, потому что вы указываете тип возвращаемого значения (void).
 Catalin Marin25 янв. 2011 г., 16:44
Я думал, что это может не работать в Java, поэтому я указал, что я использовал его в PHP (где вы можете сделать в основном любую «яркую» идею).

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

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

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

Ваш ответ на вопрос