Почему конструкторы не могут быть окончательными, статическими или абстрактными в Java?
Например, можете ли вы объяснить мне, почему это недействительно?
public class K {
abstract public K() {
// ...
}
}
Почему конструкторы не могут быть окончательными, статическими или абстрактными в Java?
Например, можете ли вы объяснить мне, почему это недействительно?
public class K {
abstract public K() {
// ...
}
}
Когда вы устанавливаете метод как final
, это означает: "Вы не хотите, чтобы какой-либо класс переопределял его". Но конструктор (в соответствии с Спецификацией языка Java) не может быть переопределен, поэтому он чист.
Когда вы устанавливаете метод как abstract
, это означает: "У метода нет тела, и он должен быть реализован в дочернем классе". Но конструктор называется неявно, когда используется ключевое слово new
, поэтому он не может лишиться тела.
Когда вы устанавливаете метод как static
, это означает: "Метод принадлежит классу, а не конкретному объекту". Но конструктор неявно вызывается для инициализации объекта, поэтому нет никакой цели в создании статического конструктора.
Вопрос в том, почему вы хотите, чтобы конструктор был static or abstract or final
.
Конструкторы не наследуются, поэтому их нельзя переопределить, поэтому использование иметь конечный конструктор
Конструктор вызывается автоматически, когда экземпляр класса он имеет доступ к полям экземпляра класса. Что будет использование статического конструктора.
Конструктор нельзя переопределить, так что вы будете делать с абстрактным конструктор.
Конструктор Java неявно конечен и неявно статичен 1 и конструктор Java не имеет смысла быть абстрактным.
Это означает, что модификаторы final
и static
будут избыточными, а ключевое слово abstract
вообще не имеет смысла.
Естественно, разработчики Java ничего не видели в разрешении избыточных и/или бессмысленных модификаторов доступа к конструкторам... поэтому они не допускаются с помощью грамматики Java.
Кроме того: стыдно, что они не делали один и тот же дизайн-вызов для методов интерфейса, где модификаторы public
и abstract
также являются избыточными, но разрешены в любом случае. Возможно, для этого существует некоторая (древняя) историческая причина. Но в любом случае он не может быть исправлен без рендеринга (возможно) миллионов существующих программ Java, несовместимых.
1 - На самом деле, конструкторы имеют смесь статической и нестатической семантики. Вы не можете "вызвать" конструктор в экземпляре, и он не наследуется и не переопределяется. Это похоже на то, как работают статические методы. С другой стороны, тело конструктора может ссылаться на this
и вызывать методы экземпляра... как метод экземпляра. И тогда есть цепочка конструкторов, которая уникальна для конструкторов. Но реальная точка зрения заключается в том, что эти аспекты фиксированы, и нет смысла разрешать избыточный модификатор static
.
public
конструктор. Объекты могут быть созданы где угодно.
конструктор по умолчанию. Объекты могут быть созданы только в одном пакете.
protected
конструктор. Объекты могут создаваться классами вне пакета, только если это подкласс.
private
конструктор. Объект может быть создан только внутри класса (например, при реализации singleton).
Ключевые слова static
, final
и abstract
не имеют смысла для конструктора, потому что:
static
члены принадлежат классу, но конструктор необходим для создания объекта.
Класс abstract
является частично реализованным классом, который содержит абстрактные методы, которые должны быть реализованы в дочернем классе.
final
ограничивает модификацию: переменные становятся постоянными, методы не могут быть переопределены, а классы не могут быть унаследованы.
Финал: поскольку вы все равно не можете перезаписывать/расширять конструктор. Вы можете расширить класс (чтобы вы не сделали его окончательным) или перезаписать метод (чтобы вы не сделали его окончательным), но для конструкторов ничего подобного нет.
Статический. Если вы посмотрите на выполнение, конструктор не является статическим (он может получить доступ к полям экземпляра), если вы посмотрите на сторону вызывающего абонента, это (тип) статично (вы вызываете его без с экземпляром. Трудно представить, что конструктор полностью статичен или не статичен и не имеет семантического разделения между этими двумя вещами, поэтому нет смысла отличать их от модификатора.
Аннотация. Реферат имеет смысл только при наличии перезаписи/расширения, поэтому применяется тот же аргумент, что и для "final".
Никакие конструкторы НИКОГДА не могут быть объявлены окончательными. Ваш компилятор всегда будет давать ошибку типа "final final final final" Финал, применяемый к методам, означает, что метод не может быть переопределен в подклассе. Конструкторы НЕ являются обычными методами. (применяются разные правила) Кроме того, конструкторы НИКОГДА не унаследованы. Таким образом, в объявлении окончательного ответа нет НИКАКИХ СЛУЧАЙ.
JLS раздел 8 упоминает об этом.
Конструкторы (§8.8) аналогичны методам, но не могут быть вызваны непосредственно вызовом метода; они используются для инициализации нового класса экземпляров. Подобные методы могут быть перегружены (§8.8.8).
Но конструкторы в расчете не являются регулярными методами. Они не могут сравниваться как таковые.
почему конструктор не может быть статичным и окончательным, четко определены в приведенных выше ответах.
Аннотация: "Абстрактный" означает отсутствие реализации. и он может быть реализован только через наследование. Поэтому, когда мы расширяем некоторый класс, все члены родительского класса наследуются в подклассе (дочерний класс), кроме "Конструктор". Итак, давайте предположим, вы каким-то образом можете объявить конструктор "Аннотация", чем как вы можете дать его реализацию в подклассе, когда конструктор не получает наследование в дочернем классе?
почему конструктор не может быть Абстрактные.
позволяет увидеть первый конечная публикация K() {
* над финалом модификатора ограничивается, потому что если он окончательный, то некоторая ситуация, когда в каком-то другом классе или в том же классе мы переопределим его, чтобы это не произошло здесь, например:
we want public void(int i,String name){
//this code not allowed
пусть static, static itz все о уровне класса, но мы создаем конструктор на основе объекта, используя ключевое слово 'new', поэтому,,, thatsall
абстракция itz худшее о здесь не у 'потому что не имеет никакого абстрактного метода или любого объявленного метода